MySQL單列索引和組合索引(聯合索引)的區別詳解


發現index merge局限性,優化器會自動判斷是否使用 index merge 優化技術,查詢還是需要組合索引【推薦閱讀:對mysql使用索引的誤解

MySQL單列索引和組合索引(聯合索引)的區別詳解
初始我寫這篇文章的原因在於面試到一家大的游戲公司的時候,一個面試題
大致的內容是怎么加速這個where a=’1′ 和 where a=’1′ and b=’2′,當時我答題的時候回答的是a加索引,a和b加聯合索引。
面試官跟我聊題目的時候說 where a=’1′ and b=’2′ 在加一個b的索引就好了,因為之前加過a的單列索引了,他很確定的告訴我,因為我沒有測試過,所以沒有反駁。在回去的路上我一直想不通,多個單列的索引和聯合索引都一樣的速度,聯合索引還有什么用?
今天有空來做個試驗,當然之前我已經查過資料了,為了確定一下
創建一個users表

  1. CREATE TABLE `users` (
  2. `userID` int(11) NOT NULL AUTO_INCREMENT,
  3. `userName` varchar(20) NOT NULL,
  4. `password` varchar(20) NOT NULL,
  5. PRIMARY KEY (`userID`)
  6. )

創建一個genUsers存儲過程,用來模擬數據

  1. delimiter $
  2. create procedure genUsers()
  3. begin
  4. declare i int default 0;
  5. while i < 100000 do
  6. set i = i + 1;
  7. insert into users(userID,userName,`password`) values(i,concat('username',i),concat('password',i));
  8. end while;
  9. end $
  10. delimiter ;

執行存儲過程

  1. call genUsers();

復制表結構和數據

  1. CREATE TABLE users2 SELECT * FROM users;

添加userName,password單列索引

  1. alter table users add index userName(userName);
  2. alter table users add index password(password);
  1. select * from users where userName like 'username65%' and password like 'password65%'; 執行時間0.06
  1. alter table users2 add index userName_password(userName,password);
  1. select * from users2 where userName like 'username65%' and password like 'password65%’;執行時間0.00秒

上面的結果每台機子測試的結果可能有所不同
原因是在mysql執行查詢的時候,只能使用一個索引,mysql會選擇一個最嚴格(獲得結果集記錄數最少)的索引。最左前綴:顧名思義,就是最左優先,打一比方
alter table users add index lname_fname_age(lname,fname,age);
創建了lname_fname_age多列索引,相當於創建了(lname)單列索引,(lname,fname)聯合索引以及(lname,fname,age)聯合索引。

QQ交流群:136351212(滿) 455721967

如無特別說明,本站文章皆為原創,若要轉載,務必請注明以下原文信息:
轉載保留版權:小松博客» MySQL單列索引和組合索引(聯合索引)的區別詳解
本文鏈接地址:https://www.phpsong.com/586.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM