MySQL單列索引和組合索引(聯合索引)的區別詳解 – 小松博客

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

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

CREATE TABLE `users`  (
  `userID`  int(11) NOT NULL AUTO_INCREMENT,
  `userName` varchar(20) NOT NULL,
  `password` varchar(20) NOT NULL,
  PRIMARY KEY (`userID`)
)

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

delimiter $
create procedure genUsers()
begin
  declare i int  default  0;
  while i <  100000  do
    set i = i +  1;
    insert into users(userID,userName,`password`) values(i,concat('username',i),concat('password',i));
  end  while;
end $
delimiter ;

執行存儲過程面試

call genUsers();

複製表結構和數據sql

CREATE TABLE users2 SELECT * FROM users;

添加userName,password單列索引測試

alter table users add index userName(userName);
alter table users add index password(password);
select  *  from users where userName like 'username65%'  and password like 'password65%';  執行時間0.06  秒
alter table users2 add index userName_password(userName,password);
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(滿) 455721967code

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

相關文章
相關標籤/搜索