先建表
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
再來個索引,來一個復合雙索引
結果一點也不好看
再試試,改成單的,用主鍵做列
還是不行
改成
這下就行了
所以說,雙索引不一定有效,怎麼使用要看實際情況,索引使用哪一列也是很講究的,這還是只是表現,我還要接著深挖下去.