一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

MySQL索引類型一覽 讓MySQL高效運(yùn)行起

 cynial 2010-11-10

索引是快速搜索的關(guān)鍵。MySQL索引的建立對(duì)于MySQL的高效運(yùn)行是很重要的。下面介紹幾種常見的MySQL索引類型。

在數(shù)據(jù)庫(kù)表中,對(duì)字段建立索引可以大大提高查詢速度。假如我們創(chuàng)建了一個(gè) mytable表:

  1. CREATE   TABLE  mytable(  
  2.  
  3. ID  INT  NOT NULL,   
  4.  
  5. username  VARCHAR (16) NOT NULL 
  6.  
  7. );  
  8.  

我們隨機(jī)向里面插入了10000條記錄,其中有一條:5555, admin。

在查找username="admin"的記錄 SELECT * FROM mytable WHERE username='admin';時(shí),如果在username上已經(jīng)建立了索引,MySQL無(wú)須任何掃描,即準(zhǔn)確可找到該記錄。相反,MySQL會(huì)掃描 所有記錄,即要查詢10000條記錄。

索引分單列索引和組合索引。單列索引,即一個(gè)索引只包含單個(gè)列,一個(gè)表可以有多個(gè)單列索引,但這不是組合索引。組合索引,即一個(gè)索包含多個(gè)列。

MySQL索引類型包括:

(1)普通索引

這是最基本的索引,它沒有任何限制。它有以下幾種創(chuàng)建方式:

◆創(chuàng)建索引

  1. CREATE   INDEX  indexName  ON  mytable(username(length)); 

如果是CHAR,VARCHAR類型,length可以小于字段實(shí)際長(zhǎng)度;如果是BLOB和TEXT類型,必須指定 length,下同。

◆修改表結(jié)構(gòu)

  1. ALTER  mytable  ADD   INDEX  [indexName]  ON  (username(length)) 

◆創(chuàng)建表的時(shí)候直接指定

  1. CREATE   TABLE  mytable(  
  2.  
  3. ID  INT  NOT NULL,   
  4.  
  5. username  VARCHAR (16) NOT NULL,  
  6.  
  7. INDEX  [indexName] (username(length))  
  8.  
  9. );  

刪除索引的語(yǔ)法:

  1. DROP   INDEX  [indexName]  ON  mytable; 

(2)唯一索引

它與前面的普通索引類似,不同的就是:索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一。它有以下幾種創(chuàng)建方式:

◆創(chuàng)建索引

  1. CREATE   UNIQUE   INDEX  indexName  ON  mytable(username(length)) 

◆修改表結(jié)構(gòu)

  1. ALTER  mytable  ADD   UNIQUE  [indexName]  ON  (username(length)) 

◆創(chuàng)建表的時(shí)候直接指定

  1. CREATE   TABLE  mytable(  
  2.  
  3. ID  INT  NOT NULL,   
  4.  
  5. username  VARCHAR (16) NOT NULL,  
  6.  
  7. UNIQUE  [indexName] (username(length))  
  8.  
  9. );  

(3)主鍵索引

它是一種特殊的唯一索引,不允許有空值。一般是在建表的時(shí)候同時(shí)創(chuàng)建主鍵索引:

  1. CREATE   TABLE  mytable(  
  2.  
  3. ID  INT  NOT NULL,   
  4.  
  5. username  VARCHAR (16) NOT NULL,  
  6.  
  7. PRIMARY   KEY (ID)  
  8.  
  9. );  

當(dāng)然也可以用 ALTER 命令。記?。阂粋€(gè)表只能有一個(gè)主鍵。

(4)組合索引

為了形象地對(duì)比單列索引和組合索引,為表添加多個(gè)字段:

  1. CREATE   TABLE  mytable(  
  2.  
  3. ID  INT  NOT NULL,   
  4.  
  5. username  VARCHAR (16) NOT NULL,  
  6.  
  7. city  VARCHAR (50) NOT NULL,  
  8.  
  9. age  INT  NOT NULL 
  10.  
  11. );  

為了進(jìn)一步榨取MySQL的效率,就要考慮建立組合索引。就是將 name, city, age建到一個(gè)索引里:

  1. ALTER   TABLE  mytable  ADD   INDEX  name_city_age ( name (10),city,age);
建表時(shí),usernname長(zhǎng)度為 16,這里用 10。這是因?yàn)橐话闱闆r下名字的長(zhǎng)度不會(huì)超過10,這樣會(huì)加速索引查詢速度,還會(huì)減少索引文件的大小,提高INSERT的更新速度。

如果分別在 usernname,city,age上建立單列索引,讓該表有3個(gè)單列索引,查詢時(shí)和上述的組合索引效率也會(huì)大不一樣,遠(yuǎn)遠(yuǎn)低于我們的組合索引。雖然此時(shí)有了三個(gè)索引,但MySQL只能用到其中的那個(gè)它認(rèn)為似乎是最有效率的單列索引。

建立這樣的組合索引,其實(shí)是相當(dāng)于分別建立了下面三組組合索引:

  1. usernname,city,age  
  2.  
  3. usernname,city  
  4.  
  5. usernname  

為什么沒有 city,age這樣的組合索引呢?這是因?yàn)镸ySQL組合索引“最左前綴”的結(jié)果。簡(jiǎn)單的理解就是只從最左面的開始組合。并不是只要包含這三列的查詢都會(huì)用到該組合索引,下面的幾個(gè)SQL就會(huì)用到這個(gè)組合索引:

  1. SELECT  *  FROM  mytable WHREE username="admin" AND city="鄭州" 
  2.  
  3. SELECT  *  FROM  mytable WHREE username="admin" 

而下面幾個(gè)則不會(huì)用到:

  1. SELECT  *  FROM  mytable WHREE age=20 AND city="鄭州" 
  2.  
  3. SELECT  *  FROM  mytable WHREE city="鄭州" 

(5)建立索引的時(shí)機(jī)

到這里我們已經(jīng)學(xué)會(huì)了建立索引,那么我們需要在什么情況下建立索引呢?一般來說,在WHERE和JOIN中出現(xiàn)的列需要建立索引,但也不完全如此, 因?yàn)镸ySQL只對(duì)<,<=,=,>,>=,BETWEEN,IN,以及某些時(shí)候的LIKE才會(huì)使用索引。例如:

  1. SELECT  t. Name  
  2.  
  3. FROM  mytable t LEFT JOIN mytable m   
  4.  
  5. ON  t. Name =m.username  WHERE  m.age=20 AND m.city='鄭州' 

此時(shí)就需要對(duì)city和age建立索引,由于mytable表的userame也出現(xiàn)在了JOIN子句中,也有對(duì)它建立索引的必要。

剛才提到只有某些時(shí)候的LIKE才需建立索引。因?yàn)樵谝酝ㄅ浞?和_開頭作查詢時(shí),MySQL不會(huì)使用索引。例如下句會(huì)使用索引:

  1. SELECT  *  FROM  mytable  WHERE  username like'admin%' 

而下句就不會(huì)使用:

  1. SELECT  *  FROM  mytable WHEREt  Name  like'%admin' 

因此,在使用LIKE時(shí)應(yīng)注意以上的區(qū)別。

(6)索引的不足之處

上面都在說使用索引的好處,但過多的使用索引將會(huì)造成濫用。因此索引也會(huì)有它的缺點(diǎn):

◆雖然索引大大提高了查詢速度,同時(shí)卻會(huì)降低更新表的速度,如對(duì)表進(jìn)行INSERT、UPDATE和DELETE。因?yàn)楦卤頃r(shí),MySQL不僅要保存數(shù)據(jù),還要保存一下索引文件。

◆建立索引會(huì)占用磁盤空間的索引文件。一般情況這個(gè)問題不太嚴(yán)重,但如果你在一個(gè)大表上創(chuàng)建了多種組合索引,索引文件的會(huì)膨脹很快。

索引只是提高效率的一個(gè)因素,如果你的MySQL有大數(shù)據(jù)量的表,就需要花時(shí)間研究建立最優(yōu)秀的索引,或優(yōu)化查詢語(yǔ)句。

(7)使用索引的注意事項(xiàng)

使用索引時(shí),有以下一些技巧和注意事項(xiàng):

◆索引不會(huì)包含有NULL值的列

只要列中包含有NULL值都將不會(huì)被包含在索引中,復(fù)合索引中只要有一列含有NULL值,那么這一列對(duì)于此復(fù)合索引就是無(wú)效的。所以我們?cè)跀?shù)據(jù)庫(kù)設(shè)計(jì)時(shí)不要讓字段的默認(rèn)值為NULL。

◆使用短索引

對(duì)串列進(jìn)行索引,如果可能應(yīng)該指定一個(gè)前綴長(zhǎng)度。例如,如果有一個(gè)CHAR(255)的列,如果在前10個(gè)或20個(gè)字符內(nèi),多數(shù)值是惟一的,那么就不要對(duì)整個(gè)列進(jìn)行索引。短索引不僅可以提高查詢速度而且可以節(jié)省磁盤空間和I/O操作。

◆索引列排序

MySQL查詢只使用一個(gè)索引,因此如果where子句中已經(jīng)使用了索引的話,那么order by中的列是不會(huì)使用索引的。因此數(shù)據(jù)庫(kù)默認(rèn)排序可以符合要求的情況下不要使用排序操作;盡量不要包含多個(gè)列的排序,如果需要最好給這些列創(chuàng)建復(fù)合索引。

◆like語(yǔ)句操作

一般情況下不鼓勵(lì)使用like操作,如果非使用不可,如何使用也是一個(gè)問題。like “%aaa%” 不會(huì)使用索引而like “aaa%”可以使用索引。

◆不要在列上進(jìn)行運(yùn)算

  1. select  *  from  users  where  YEAR(adddate)<2007; 

將在每個(gè)行上進(jìn)行運(yùn)算,這將導(dǎo)致索引失效而進(jìn)行全表掃描,因此我們可以改成

  1. select  *  from  users  where  adddate<‘2007-01-01’;  

◆不使用NOT IN和<>操作

以上,就對(duì)其中MySQL索引類型進(jìn)行了介紹。


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    大香蕉精品视频一区二区| 99久久婷婷国产亚洲综合精品| 粉嫩国产美女国产av| 午夜国产精品福利在线观看| 成人免费高清在线一区二区| 成年人视频日本大香蕉久久| 国产成人高清精品尤物| 正在播放国产又粗又长| 亚洲综合一区二区三区在线| 中文字幕在线区中文色| 国产成人精品国产成人亚洲 | 黄色国产自拍在线观看| 国产精品久久精品毛片| 亚洲夫妻性生活免费视频| 欧美久久一区二区精品| 亚洲中文字幕人妻系列| 欧美中文字幕日韩精品| 国产精品成人免费精品自在线观看| 国产又粗又猛又长又大| 成人三级视频在线观看不卡| 国产午夜精品亚洲精品国产| 高清免费在线不卡视频| 成在线人免费视频一区二区| 亚洲视频一区自拍偷拍另类| 亚洲人妻av中文字幕| 加勒比东京热拍拍一区二区| 日本乱论一区二区三区| 天堂热东京热男人天堂| 免费黄片视频美女一区| 国产一区二区不卡在线视频| 国产精品不卡一区二区三区四区| 亚洲成人精品免费在线观看| 国产精品一区二区视频大全| 国产日韩欧美综合视频| 日本精品免费在线观看| 成人午夜爽爽爽免费视频| 少妇激情在线免费观看| 亚洲视频一区自拍偷拍另类| 久久碰国产一区二区三区| 国产女高清在线看免费观看| 国产在线观看不卡一区二区|