天天看點

mysql選擇聯合索引還是單索引?索引列應該使用哪一個最有效?深入測試探讨

先建表

CREATE TABLE `menu_employee` (

 `Id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主鍵,無實際意義',

 `employee_pid` int(5) DEFAULT NULL COMMENT '父節點序号,一般是部門的序号,但是已有例外,沒有組的員工',

 `employee_id` int(5) DEFAULT NULL COMMENT '員工序号,相應的部門序号+員工序号',

 `employee_name` varchar(100) DEFAULT '' COMMENT '員工名稱',

 `action` varchar(100) DEFAULT NULL COMMENT 'action事件路徑',

 PRIMARY KEY (`Id`),

  KEY`x` (`employee_id`,`employee_pid`) USING BTREE

) ENGINE=MyISAM AUTO_INCREMENT=38 DEFAULTCHARSET=utf8 COMMENT='員工表'

資料自己添加.

好,開始測試:

寫一個SQL,來跑一下試試

EXPLAIN

SELECT

       employee_name

FROM

       menu_employee

FORCE INDEX ( x )

WHERE

       employee_id> 3

AND

       employee_pid> 20

order by

   employee_pid

建一個索引,按照黃金律,把WHERE跟着了,一起建一個聯合索引.

結果是:

是不是很奇怪,明明了用了索引了,可是卻依然是 Using filesort!

好,接着我們改回單索引

再看結果:

是不是很神奇?

再試一下,那我們如果把索引列換成employee_id會腫麼樣呢,我們來試一試,

居然沒有什麼效果,還是Using filesort!

接下來說複合索引

先建表:

CREATE TABLE `l_insertlogs` (

 `ID` int(10) NOT NULL AUTO_INCREMENT,

 `Counts` int(10) DEFAULT NULL,

 `TablesName` char(30) DEFAULT NULL,

 `OperateTime` datetime DEFAULT NULL,

 PRIMARY KEY (`ID`),

  KEY`x` (`Counts`,`ID`) USING BTREE

) ENGINE=InnoDB AUTO_INCREMENT=6155 DEFAULTCHARSET=utf8

跑一下:

       TablesName

       l_insertlogs

       IDbetween 100 and 500

       Counts> 14

  Counts

再來個索引,來一個複合雙索引

結果一點也不好看

再試試,改成單的,用主鍵做列

還是不行

改成

這下就行了

是以說,雙索引不一定有效,怎麼使用要看實際情況,索引使用哪一列也是很講究的,這還是隻是表現,我還要接着深挖下去.