日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql索引使增删变慢_mysql优化(四)–索引

發(fā)布時間:2024/7/5 数据库 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql索引使增删变慢_mysql优化(四)–索引 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

http://www.cnblogs.com/hustcat/archive/2009/10/28/1591648.html

一、 四種索引類型:

主鍵索引,唯一索引,全文索引,普通索引

二、 ?為什么建立索引比較快

一般的數(shù)據(jù)表是按照行來存儲的,字段多、有長字段的表的記錄就會長,就要占用更多的空間來存儲,而索引是建立在一個或少數(shù)幾個字段上的特殊數(shù)據(jù)結(jié)構(gòu),一個索引項的存儲開銷和表的記錄相比是很小的。

所謂查詢速度更快,其實發(fā)生在計算機內(nèi)部的動作有三大步驟,即輸入、處理和輸出,完成整套動作之后,你才能體會到快慢,而在這三個動作中,輸入通常就是從硬盤上裝載數(shù)據(jù)到內(nèi)存,它耗時最甚,那么讀取索引和讀取表的全部行的數(shù)據(jù)量差異就大大影響最終性能。另外,索引是排好序的,能夠?qū)嵤┒植檎宜惴?#xff0c;比其行掃描(讀取表的所有記錄,逐行判斷是否滿足條件)這種順序查找算法來說,效率提升也以數(shù)量級計。

三、 各種索引的增刪查改

3.1?增加

3.1.1?主鍵索引添加

當一張表,把某個列設為主鍵的時候,則該列就是主鍵索引

create table aaa

(id int unsigned primary key auto_increment ,

name varchar(32) not null defaul ‘’);

這是id 列就是主鍵索引.

如果你創(chuàng)建表時,沒有指定主鍵索引,也可以在創(chuàng)建表后,在添加, 指令:

alter table 表名 add primary key (列名);

舉例:

create table bbb (id int , name varchar(32) not null default ‘’);

alter table bbb add primary key (id);

3.1.2?普通索引

一般來說,普通索引的創(chuàng)建,是先創(chuàng)建表,然后在創(chuàng)建普通索引

比如:

create table ccc(

id int unsigned,

name varchar(32)

)

create index 索引名 on 表 (列1,列名2);

3.1.3 全文索引

全文索引,主要是針對文件,文本的檢索, 比如文章, 全文索引針對MyISAM有用.

創(chuàng)建 :

CREATE TABLE articles (

id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,

title VARCHAR(200),

body TEXT,

FULLTEXT (title,body)

)engine=myisam charset utf8;

如何使用全文索引:

錯誤用法:

select * from articles where body like ‘%mysql%’; 【不會使用到全文索引】

mysql> explain select * from articles where body like ‘mysql%’\G

*************************** 1. row ***************************

id: 1

select_type: SIMPLE

table: articles

type: ALL

possible_keys: NULL

key: NULL

key_len: NULL

ref: NULL

rows: 6

Extra: Using where

1 row in set (0.00 sec)

證明:

explain? select * from articles where body like ‘%mysql%’

正確的用法是:

select * from articles where match(title,body) against(‘database’); 【可以】

mysql> explain select * from articles where match(title,body) against ( ‘mysql’)\G

*************************** 1. row ***************************

id: 1

select_type: SIMPLE

table: articles

type: fulltext

possible_keys: title

key: title

key_len: 0

ref: NULL

rows: 1

Extra: Using where

1 row in set (0.00 sec)

? 說明:

在mysql中fulltext 索引只針對 myisam生效

mysql自己提供的fulltext針對英文生效->sphinx (coreseek) 技術(shù)處理中文

使用方法是 match(字段名..) against(‘關(guān)鍵字’)

全文索引:停止詞, 因為在一個文本中,創(chuàng)建索引是一個無窮大的數(shù),因此,對一些常用詞和字符,就不會創(chuàng)建,這些詞,稱為停止詞.比如(a,b,mysql,the)

3.1.4?唯一索引

①當表的某列被指定為unique約束時,這列就是一個唯一索引

create table ddd(id int primary key auto_increment , name varchar(32) unique);

這時, name 列就是一個唯一索引.

unique字段可以為NULL,并可以有多NULL, 但是如果是具體內(nèi)容,則不能重復,

但是不能存有重復的空字符串’’

主鍵字段,不能為NULL,也不能重復.

②在創(chuàng)建表后,再去創(chuàng)建唯一索引

create table eee(id int primary key auto_increment, name varchar(32));

create unique index 索引名? on 表名 (列表..);

3.2 索引查詢

desc 表名 【該方法的缺點是: 不能夠顯示索引名.】

show index(es) from 表名

show keys from 表名

3.3 索引刪除

alter table 表名 drop index 索引名;

如果刪除主鍵索引。

alter table 表名 drop primary key

3.4 修改索引

先刪除索引再重新創(chuàng)建索引

四、索引的代價

占用磁盤空間、使得dml 增刪改操作變慢。索引主要用于查操作變快。

五、哪些列上適合加索引

5.1 較頻繁的作為查詢條件的字段應該創(chuàng)建索引

5.2 唯一性太差的字段不適合創(chuàng)建索引

5.3 更新非常頻繁的字段不適合創(chuàng)建索引

5.4 不會出現(xiàn)在where字句中的字段不適合創(chuàng)建索引

總結(jié): 滿足以下條件的字段,才應該創(chuàng)建索引.

a: 肯定在where條件經(jīng)常使用 b: 該字段的內(nèi)容不是唯一的幾個值(sex) c: 字段內(nèi)容不是頻繁變化.

六、查看索引的使用情況

如果索引正在工作,Handler_read_key的值將很高,這個值代表了一個行被索引值讀的次數(shù),很低的值表明增加索引得到的性能改善不高,因為索引并不經(jīng)常使用。

Handler_read_rnd_next的值高則意味著查詢運行低效,并且應該建立索引補救。這個值的含義是在數(shù)據(jù)文件中讀下一行的請求數(shù)。如果你正進行大量的表掃描,該值較高。通常說明表索引不正確或?qū)懭氲牟樵儧]有利用索引。

語法:? ? mysql> show status like ‘Handler_read%';

七、使用索引的幾個注意點

7.1??對于創(chuàng)建的多列索引,只要查詢條件使用了最左邊的列,索引一般就會被使用。如果只使用右邊的列,索引不會被使用。

7.2?對于使用like的查詢,查詢?nèi)绻?‘%aaa’ 不會使用到索引。‘a(chǎn)aa%’ 會使用到索引。在like查詢時,關(guān)鍵的 ‘關(guān)鍵字’ , 最前面,不能使用 % 或者 _這樣的字符., 如果一定要前面有變化的值,則考慮使用 全文索引->sphinx.

7.3??如果條件中有or,即使其中有條件帶索引也不會使用。換言之,就是要求使用的所有字段,都必須建立索引, 我們建議大家盡量避免使用or 關(guān)鍵字

7.4 ?如果列類型是字符串,那一定要在條件中將數(shù)據(jù)使用引號引用起來。否則不使用索引。(添加時,字符串必須’’), 也就是,如果列是字符串類型,就一定要用 ‘’ 把他包括起來.

7.5 ?如果mysql估計使用全表掃描要比使用索引快,則不使用索引。

八、 如何選擇mysql的存儲引擎

8.1 在開發(fā)中,我們經(jīng)常使用的存儲引擎 myisam / innodb/ memory

myisam 存儲: 如果表對事務要求不高,同時是以查詢和添加為主的,我們考慮使用myisam存儲引擎. ,比如 bbs 中的 發(fā)帖表,回復表.

INNODB 存儲: 對事務要求高,保存的數(shù)據(jù)都是重要數(shù)據(jù),我們建議使用INNODB,比如訂單表,賬號表.

8.2 MyISAM 和 INNODB的區(qū)別

事務安全(MyISAM不支持事務,INNODB支持事務)

查詢和添加速度(MyISAM批量插入速度快)

支持全文索引(MyISAM支持全文索引,INNODB不支持全文索引)

鎖機制(MyISAM時表鎖,innodb是行鎖)

外鍵 MyISAM 不支持外鍵, INNODB支持外鍵. (在PHP開發(fā)中,通常不設置外鍵,通常是在程序中保證數(shù)據(jù)的一致)

Memory 存儲,比如我們數(shù)據(jù)變化頻繁,不需要入庫,同時又頻繁的查詢和修改,我們考慮使用memory, 速度極快. (如果mysql重啟的話,數(shù)據(jù)就不存在了)

如果你的數(shù)據(jù)庫的存儲引擎是myisam,請一定記住要定時進行碎片整理,因為在myisam引擎中,如果刪除數(shù)據(jù),空間不會被回收,索引你會發(fā)現(xiàn)雖然數(shù)據(jù)刪除很多,但是空間占用依然很厲害,索引需要使用optimize語句進行空間的回收整理。

總結(jié)

以上是生活随笔為你收集整理的mysql索引使增删变慢_mysql优化(四)–索引的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。