程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> mysql選擇聯合索引還是單索引?索引列應該使用哪一個最有效?深入測試探討

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

編輯: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

跑一下:

EXPLAIN

SELECT

TablesName

FROM

l_insertlogs

FORCE INDEX ( x )

WHERE

IDbetween 100 and 500

AND

Counts> 14

order by

  Counts

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

結果一點也不好看 

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

還是不行

改成

這下就行了

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved