聯(lián)合索引(a,b)墨辛,顛覆你對MySQL 索引的印象

一英融、表結(jié)構(gòu)

CREATE TABLE `cd_happy_for_ni_deals` (
  `id` int(11) NOT NULL DEFAULT '0',
  `update_time` datetime DEFAULT NULL COMMENT '更新時間',
  `publish_status` int(11) NOT NULL DEFAULT '4' COMMENT '發(fā)布狀態(tài)',
  KEY `idx_of_publish_status_update_time` (`publish_status`,`update_time`,`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

二铃彰、唯一性基數(shù)

mysql> select count(distinct(update_time)) from cd_happy_for_ni_deals;
+------------------------------+
| count(distinct(update_time)) |
+------------------------------+
|                      1845933 |
+------------------------------+
1 row in set (4.68 sec)

mysql> select count(distinct(publish_status)) from cd_happy_for_ni_deals;
+---------------------------------+
| count(distinct(publish_status)) |
+---------------------------------+
|                               2 |
+---------------------------------+
1 row in set (1.76 sec)

mysql> select count(id) from cd_happy_for_ni_deals;
+-----------+
| count(id) |
+-----------+
|   1907609 |
+-----------+
1 row in set (0.00 sec)

update_time 的選擇性:1845933 / 1907609.to_f = 0.9676684268107353 接近1

publish_status 的選擇性: 2 / 1907609.to_f = 1.0484328811617055e-06 接近0

三绍豁、建立(a,b) 索引,分別根據(jù) a 查詢牙捉,b 查詢竹揍,(a,b) 查詢,(b,a) 查詢鹃共,統(tǒng)計結(jié)果

不走尋常路鬼佣,我就偏選擇 選擇性低的做索引的第一位。

創(chuàng)建索引

mysql> alter table cd_happy_for_ni_deals add index `idx_of_publish_status_update_time` (`publish_status`, `update_time`, `id`);
Query OK, 0 rows affected (14.69 sec)
Records: 0  Duplicates: 0  Warnings: 0

根據(jù)a 查詢

mysql> explain select SQL_NO_CACHE id, publish_status from cd_happy_for_ni_deals where publish_status = 4 \G;
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: cd_happy_for_ni_deals
         type: ref
possible_keys: idx_of_publish_status_update_time
          key: idx_of_publish_status_update_time
      key_len: 4
          ref: const
         rows: 964056 <- 只查詢publish_status 的情況
        Extra: Using index
1 row in set (0.00 sec)

平均查詢時間:

mysql> select SQL_NO_CACHE count(id) from cd_happy_for_ni_deals where publish_status = 4 \G;
*************************** 1. row ***************************
count(id): 1858081
1 row in set (0.69 sec)

理論上可以用到索引(a,b) 中的 a 部分霜浴。

根據(jù)b 查詢

mysql> explain select SQL_NO_CACHE id, publish_status from cd_happy_for_ni_deals where update_time = '2014-05-17 23:00:48' \G;
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: cd_happy_for_ni_deals
         type: index
possible_keys: NULL
          key: idx_of_publish_status_update_time
      key_len: 17
          ref: NULL
         rows: 1928113 <- 只查詢update_time 的情況
        Extra: Using where; Using index
1 row in set (0.01 sec)

平均查詢時間:

mysql> select SQL_NO_CACHE count(id) from cd_happy_for_ni_deals where update_time = '2014-05-17 23:00:48' \G;
*************************** 1. row ***************************
count(id): 1
1 row in set (1.06 sec)

查詢b 的時候晶衷,理論上用不到索引的。為啥這里阴孟?晌纫??

根據(jù)(a,b) 查詢

mysql> explain select SQL_NO_CACHE id, publish_status from cd_happy_for_ni_deals where publish_status = 4 and update_time = '2014-05-17 23:00:48' \G;
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: cd_happy_for_ni_deals
         type: ref
possible_keys: idx_of_publish_status_update_time
          key: idx_of_publish_status_update_time
      key_len: 13
          ref: const,const
         rows: 1
        Extra: Using where; Using index
1 row in set (0.01 sec)

平均查詢時間:

mysql> select SQL_NO_CACHE count(id) from cd_happy_for_ni_deals where publish_status = 4 and update_time = '2014-05-17 23:00:48' \G;
*************************** 1. row ***************************
count(id): 1
1 row in set (0.00 sec)

符合理論上的預(yù)期永丝。

根據(jù)(b,a) 查詢

mysql> explain select SQL_NO_CACHE id, publish_status from cd_happy_for_ni_deals where  update_time = '2014-05-17 23:00:48' and publish_status = 4 \G;
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: cd_happy_for_ni_deals
         type: ref
possible_keys: idx_of_publish_status_update_time
          key: idx_of_publish_status_update_time
      key_len: 13
          ref: const,const
         rows: 1
        Extra: Using where; Using index
1 row in set (0.00 sec)

平均查詢時間:

mysql> select SQL_NO_CACHE count(id) from cd_happy_for_ni_deals where  update_time = '2014-05-17 23:00:48' and publish_status = 4 \G;
*************************** 1. row ***************************
count(id): 1
1 row in set (0.00 sec)

理論上锹漱,這里只能用到(a,b)中的a部分,為啥也這么快慕嚷?哥牍?

結(jié)論:

1、理論上索引對順序是敏感的喝检,但是由于MySQL的查詢優(yōu)化器會自動調(diào)整where子句的條件順序以使用適合的索引嗅辣。

2、將選擇性高的列放在索引的最前列挠说。根據(jù)場景的不同澡谭,這條經(jīng)驗法則并不是完全準(zhǔn)確的。在某些場景下损俭,可能需要根據(jù)運行頻率最高的查詢來調(diào)整索引列的順序蛙奖。

參考

http://www.programering.com/a/MTMwAzMwATM.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市杆兵,隨后出現(xiàn)的幾起案子雁仲,更是在濱河造成了極大的恐慌,老刑警劉巖琐脏,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件攒砖,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)祭衩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來阅签,“玉大人掐暮,你說我怎么就攤上這事≌樱” “怎么了路克?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長养交。 經(jīng)常有香客問我精算,道長,這世上最難降的妖魔是什么碎连? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任灰羽,我火速辦了婚禮,結(jié)果婚禮上鱼辙,老公的妹妹穿的比我還像新娘廉嚼。我一直安慰自己,他們只是感情好倒戏,可當(dāng)我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布怠噪。 她就那樣靜靜地躺著,像睡著了一般杜跷。 火紅的嫁衣襯著肌膚如雪傍念。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天葛闷,我揣著相機(jī)與錄音憋槐,去河邊找鬼。 笑死孵运,一個胖子當(dāng)著我的面吹牛秦陋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播治笨,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼驳概,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了旷赖?” 一聲冷哼從身側(cè)響起顺又,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎等孵,沒想到半個月后稚照,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年果录,在試婚紗的時候發(fā)現(xiàn)自己被綠了上枕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡弱恒,死狀恐怖辨萍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情返弹,我是刑警寧澤锈玉,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站义起,受9級特大地震影響拉背,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜默终,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一椅棺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧穷蛹,春花似錦土陪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蛙吏,卻和暖如春源哩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鸦做。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工励烦, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人泼诱。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓坛掠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親治筒。 傳聞我的和親對象是個殘疾皇子屉栓,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容