Mysql索引的使用 - 組合索引 + 範圍條件的處理
結果是:KEY(key_part1,key_part2,key_part3)
select .... from table where key_part1='xxx' and key_part3='yyy';
在這種情況下,MYSQL只能在索引裡處理掉key_par1,而不過在索引裡過濾 key_part3的條件,除非 select 後面是 count(*) ;[@more@]
這是上次測試時的表結構:
CREATE TABLE `im_message_201005_21_old` (
`msg_id` bigint(20) NOT NULL default '0',
`time` datetime NOT NULL,
`owner` varchar(64) NOT NULL,
`other` varchar(64) NOT NULL,
`content` varchar(8000) default NULL,
PRIMARY KEY (`msg_id`),
KEY `im_msg_own_oth_tim_ind` (`owner`,`other`,`time`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_bin;
這次我們要測試的是,先有範圍欄位的條件,MYSQL是不是能正確使用索引有效地過濾無效資料;
首先我們把索引的順序調整一下:KEY `im_msg_own_tim_oth_ind` (`owner`,`time`,`other`)
我們要測試的是當where 條件是: owner+time+other 時, 索引的工作情況如何?
(大家不如先根據自己的知識下個定論?)
我覺得大部分同學認為,欄位都一樣,索引應該是能正常工作的。 實際是不然。
這個測試關鍵是想看看, 當查詢條件是 owner+time+other 時 , mysql 能不能在回表前,把other欄位進行過濾;
如果不能過濾,他將與條件是 owner+time 時,產生的效能(邏輯讀)是差不多的;
select count(distinct content ) from im_message_201005_21_old
where owner = 'cntaobaoytazy' and time >= '2010-05-23 17:14:23' and time <= '2010-05-30 17:14:23' ;
# 結果: 4712行
# 產生邏輯讀:27625
select count(distinct content ) from im_message_201005_21_old
where owner = 'cntaobaoytazy' and time >= '2010-05-23 17:14:23' and time <= '2010-05-30 17:14:23'
and other = 'cnalichnahappycow' ;
# 結果:0行
# 產生邏輯讀:25516
select count(* ) from im_message_201005_21_old
where owner = 'cntaobaoytazy' and time >= '2010-05-23 17:14:23' and time <= '2010-05-30 17:14:23' ;
# 結果: 4712
# 產生邏輯讀: 966
select count(* ) from im_message_201005_21_old
where owner = 'cntaobaoytazy' and time >= '2010-05-23 17:14:23' and time <= '2010-05-30 17:14:23'
and other = 'cnalichnahappycow' ;
# 結果:0
# 產生邏輯讀: 966
從中我們發現 ,count(*)這種情況,只需要透過索引去過濾,不需要回表,邏輯讀966; 這是比較合理的值;
而第二個語句,雖然返回結果是0行,但使用了與第一個語句相當的邏輯讀 ; 顯然,MYSQL沒有合理使用索引 ;
總結一下:
MYSQL在碰到複合索引時,只要碰到範圍(,<=,>=)的查詢欄位,過濾該條件後就去回表了,不管後面的欄位有沒有可以索引可以走。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/703656/viewspace-1034075/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Mysql索引的使用-組合索引+跳躍條件MySql索引
- 【索引】反向索引--條件 範圍查詢索引
- 【索引】反向索引--條件 範圍查詢(二)索引
- mysql的組合索引MySql索引
- 使用組合索引處理包含空值的查詢索引
- mysql組合索引,abc索引命中MySql索引
- MySQL單列索引和組合索引的區別MySql索引
- mysql索引合併:一條sql可以使用多個索引MySql索引
- MySQL 組合索引不生效MySql索引
- MySQL單列索引和組合索引的區別介紹MySql索引
- MySQL索引條件下推的簡單測試MySql索引
- 關於聯合索引,範圍查詢,時間列索引的幾個問題索引
- MySQL學習筆記:組合索引-索引下推MySql筆記索引
- 【原創】MySQL 模擬條件索引MySql索引
- ORACLE 組合索引 使用分析Oracle索引
- MongoDB範圍查詢的索引優化MongoDB索引優化
- Oracle中組合索引的使用詳解Oracle索引
- MySQL的聯合索引MySql索引
- 索引與null(二):組合索引索引Null
- 【原創】MySQL 模擬條件索引薦MySql索引
- Percona MySQL 5.6 WHERE 條件中 OR 的索引測試MySql索引
- 【Mysql】InnoDB 中的聚簇索引、二級索引、聯合索引MySql索引
- ORACLE 索引和MYSQL INNODB 輔助索引對NULL的處理區別Oracle索引MySqlNull
- 對線面試官:Mysql組合索引的生效規則面試MySql索引
- (11)mysql 中的條件定義、處理MySql
- 組合索引的選擇原則索引
- mysql 索引合併MySql索引
- MySQL複合索引MySql索引
- SQLServer索引優化(3):對於建組合索引的要求SQLServer索引優化
- MySQL 唯一索引範圍查詢鎖下一個記錄的理解MySql索引
- MYSQL DQL in 到底會不會走索引&in 範圍查詢引發的思考。MySql索引
- MySQL組合索引和最左匹配原則MySql索引
- 索引設計(組合索引適用場景)索引
- 各種索引型別發生的條件索引型別
- MySQL複合索引探究MySql索引
- MySQL建立複合索引MySql索引
- mysql聯合索引的選擇性MySql索引
- MySQL學習筆記:組合索引-最左原則MySql筆記索引