<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          MySQL范圍查找時(shí),索引失效問題探究

          共 2363字,需瀏覽 5分鐘

           ·

          2021-11-28 14:45

          往期熱門文章:

          1、有了 for (;;) ,為什么還需要while (true) ?到底哪個(gè)更快?

          2、名企公開掛“加班真好”標(biāo)語,員工稱一年被免費(fèi)“白嫖”600多小時(shí)!網(wǎng)友看不下去了,稽查部門展開調(diào)查...

          3、面試官:為什么 Java 不把基本類型放在堆中?我竟然答不上來。。

          4、IDEA 注釋模板這樣搞!

          5、后端開掛:3行代碼寫出8個(gè)接口!

          來源:blog.csdn.net/qq_25188255/

          article/details/81316498

          1 問題描述

          本文對(duì)建立好的復(fù)合索引進(jìn)行排序,并取記錄中非索引字段,發(fā)現(xiàn)索引不生效,例如,有如下表,DDL語句為:
          CREATE?TABLE?`employees`?(
          ??`emp_no`?int(11)?NOT?NULL,
          ??`birth_date`?date?NOT?NULL,
          ??`first_name`?varchar(14)?NOT?NULL,
          ??`last_name`?varchar(16)?NOT?NULL,
          ??`gender`?enum('M','F')?NOT?NULL,
          ??`hire_date`?date?NOT?NULL,
          ??`age`?int(11)?NOT?NULL,
          ??PRIMARY?KEY?(`emp_no`),
          ??KEY?`unique_birth_name`?(`first_name`,`last_name`)?USING?BTREE
          ??)?ENGINE=InnoDB?DEFAULT?CHARSET=utf8;
          復(fù)合索引為unique_birth_name (first_name,last_name)?。使用以下語句:
          EXPLAIN?SELECT
          ????gender
          FROM
          ????employees
          ORDER?BY
          ????first_name,
          ????last_name
          根據(jù)上圖:type:all?及?Extra:Using filesort?可得,索引沒有生效。
          繼續(xù)進(jìn)行試驗(yàn),對(duì)查詢語句進(jìn)一步改寫,加上一個(gè)范圍查找:
          EXPLAIN?SELECT
          ????gender
          FROM
          ????employees
          WHERE?first_name?>?'Leah'
          ORDER?BY
          ????first_name,
          ????last_name
          執(zhí)行計(jì)劃顯示如下圖:
          這里發(fā)現(xiàn)結(jié)果和第一次sql分析無異。繼續(xù)試驗(yàn)。
          改寫sql語句:
          EXPLAIN?SELECT
          ????gender
          FROM
          ????employees
          WHERE?first_name?>?'Tzvetan'
          ORDER?BY
          ????first_name,
          ????last_name
          此時(shí),令人驚訝的是,索引生效了。

          2 問題分析

          此時(shí),我們做一個(gè)大膽的猜測(cè):
          第一次進(jìn)行sql分析時(shí),因?yàn)榈谝淮蝟rder by 后,得到的還是全表數(shù)據(jù),如果根據(jù)復(fù)合索引中攜帶的主鍵查找每一個(gè)gender進(jìn)行拼接,自然很費(fèi)資源和時(shí)間,mysql不會(huì)做如此蠢的事。不如直接進(jìn)行全表掃描,把掃描到的每條數(shù)據(jù)和order by得到的臨時(shí)數(shù)據(jù)進(jìn)行拼接,從而得到需要的數(shù)據(jù)。
          為了驗(yàn)證上述想法的正確性,我們對(duì)三次sql進(jìn)行分析。
          第一次sql根據(jù)復(fù)合索引得到的數(shù)據(jù)量為:300024,為全表數(shù)據(jù)
          SELECT
          ????COUNT(first_name)
          FROM
          ????employees
          ORDER?BY
          ????first_name,
          ????last_name
          第二次改寫的sql根據(jù)復(fù)合索引得到的數(shù)據(jù)量為:159149 , 為全表數(shù)據(jù)量的1/2。
          SELECT
          ????COUNT(first_name)
          FROM
          ????employees
          WHERE?first_name?>?'Leah'
          ORDER?BY
          ????first_name,
          ????last_name
          第三次改寫的sql根據(jù)復(fù)合索引得到的數(shù)據(jù)量為:36731, 為全表數(shù)據(jù)量的1/10。
          SELECT
          ????COUNT(first_name)
          FROM
          ????employees
          WHERE?first_name?>?'Tzvetan'
          ORDER?BY
          ????first_name,
          ????last_name
          通過對(duì)比發(fā)現(xiàn),第二次改寫的sql根據(jù)復(fù)合索引得到的數(shù)據(jù)量是全表數(shù)據(jù)量的1/2。此時(shí)還沒有達(dá)到mysql使用索引進(jìn)行二次查找的量級(jí)。
          第三次改寫的sql根據(jù)復(fù)合索引得到的數(shù)據(jù)量是全表數(shù)據(jù)量的1/10,達(dá)到了mysql使用索引進(jìn)行二次查找的量級(jí),于是從執(zhí)行計(jì)劃上可以看到,第三次改寫sql是走了索引的。

          3 總結(jié)

          mysql 是否根據(jù)首次索引條件查詢出的主鍵進(jìn)行二次查找,也是要看查詢出來的數(shù)據(jù)量級(jí),如果數(shù)據(jù)量接近全表數(shù)據(jù)量的話,就會(huì)進(jìn)行全表掃描,否則根據(jù)第一次查詢出來的主鍵進(jìn)行二次查詢。

          最近熱文閱讀:

          1、有了 for (;;) ,為什么還需要while (true) ?到底哪個(gè)更快?
          2、名企公開掛“加班真好”標(biāo)語,員工稱一年被免費(fèi)“白嫖”600多小時(shí)!網(wǎng)友看不下去了,稽查部門展開調(diào)查...
          3、面試官:為什么 Java 不把基本類型放在堆中?我竟然答不上來。。
          4、IDEA 注釋模板這樣搞!
          5、后端開掛:3行代碼寫出8個(gè)接口!
          6、推薦一款可視化配置 Nginx 的神器
          7、一款性能調(diào)優(yōu)利器 — 火焰圖
          8、Redis 實(shí)現(xiàn)限流的三種方式
          9、推薦 15 款常用開發(fā)工具
          10、一次 QPS 翻倍的 Java 服務(wù)性能優(yōu)化
          關(guān)注公眾號(hào),你想要的Java都在這里

          瀏覽 52
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  91.九色蝌蚪视频 | 久久久精品偷拍 | 国产专区123 | 国产的色情电影在线播放 | 黄片欧美在线观看 |