最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

分析MySQL中優(yōu)化distinct的技巧

 更新時(shí)間:2015年05月08日 09:41:15   作者:羅龍九  
這篇文章主要介紹了分析MySQL中優(yōu)化distinct的技巧,主要是通過(guò)減少本地掃描的次數(shù)來(lái)進(jìn)行優(yōu)化的方法,需要的朋友可以參考下

有這樣的一個(gè)需求:select count(distinct nick) from user_access_xx_xx;

這條sql用于統(tǒng)計(jì)用戶訪問(wèn)的uv,由于單表的數(shù)據(jù)量在10G以上,即使在user_access_xx_xx上加上nick的索引,

通過(guò)查看執(zhí)行計(jì)劃,也為全索引掃描,sql在執(zhí)行的時(shí)候,會(huì)對(duì)整個(gè)服務(wù)器帶來(lái)抖動(dòng);

root@db 09:00:12>select count(distinct nick) from user_access;

+———————-+

| count(distinct nick) |

+———————-+

|        806934 |

+———————-+

1 row in set (52.78 sec)

執(zhí)行一次sql需要花費(fèi)52.78s,已經(jīng)非常的慢了

現(xiàn)在需要換一種思路來(lái)解決該問(wèn)題:

我們知道索引的值是按照索引字段升序的,比如我們對(duì)(nick,other_column)兩個(gè)字段做了索引,那么在索引中的則是按照nick,other_column的升序排列:

我們現(xiàn)在的sql:select count(distinct nick) from user_access;則是直接從nick1開(kāi)始一條條掃描下來(lái),直到掃描到最后一個(gè)nick_n,

那么中間過(guò)程會(huì)掃描很多重復(fù)的nick,如果我們能夠跳過(guò)中間重復(fù)的nick,則性能會(huì)優(yōu)化非常多(在oracle中,這種掃描技術(shù)為loose index scan,但在5.1的版本中,mysql中還不能直接支持這種優(yōu)化技術(shù)):

20155893909060.jpg (532×255)

所以需要通過(guò)改寫(xiě)sql來(lái)達(dá)到偽loose index scan:

root@db 09:41:30>select count(*) from ( select distinct(nick) from user_access)t ;

| count(*) |

+———-+

|  806934 |

1 row in set (5.81 sec)

Sql中先選出不同的nick,最后在外面套一層,就可以得到nick的distinct值總和;

最重要的是在子查詢中:select distinct(nick) 實(shí)現(xiàn)了上圖中的偽loose index scan,優(yōu)化器在這個(gè)時(shí)候的執(zhí)行計(jì)劃為Using index for group-by ,

需要注意的是mysql把distinct優(yōu)化為group by,它首先利用索引來(lái)分組,然后掃描索引,對(duì)需要的nick只掃描一次;

兩個(gè)sql的執(zhí)行計(jì)劃分別為:

優(yōu)化寫(xiě)法:

root@db 09:41:10>explain select distinct(nick) from user_access-> ;

+—-+————-+——————————+——-+—————+————-| id | select_type | table            | type | possible_keys | key               | key_len | ref | rows  | Extra          |

+—-+————-+——————————+——-+—————+————-

| 1 | SIMPLE   | user_access | range | NULL     | ind_user_access_nick | 67   | NULL | 2124695 | Using index for group-by |

+—-+————-+——————————+——-+—————+————-

原始寫(xiě)法:

root@db 09:42:55>explain select count(distinct nick) from user_access;

+—-+————-+——————————+——-+—————+————-

| id | select_type | table            | type | possible_keys | key            | key_len | ref | rows   | Extra    |

+—-+————-+——————————+——-+—————+————-

| 1 | SIMPLE   | user_access | index | NULL     | ind_user_access | 177   | NULL | 19546123 | Using index |

相關(guān)文章

  • Mysql8.0輕松實(shí)現(xiàn)主從復(fù)制

    Mysql8.0輕松實(shí)現(xiàn)主從復(fù)制

    這篇文章主要介紹了Mysql8.0輕松實(shí)現(xiàn)主從復(fù)制方法的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • MySQL常見(jiàn)的存儲(chǔ)引擎和區(qū)別說(shuō)明

    MySQL常見(jiàn)的存儲(chǔ)引擎和區(qū)別說(shuō)明

    MySQL支持多種存儲(chǔ)引擎,如InnoDB、MyISAM、MEMORY、Archive、CSV和Blackhole,每種引擎有其特點(diǎn)和適用場(chǎng)景,選擇存儲(chǔ)引擎時(shí)需根據(jù)業(yè)務(wù)需求考慮事務(wù)、性能、存儲(chǔ)成本等因素
    2025-03-03
  • mysql8.0.21下載安裝詳細(xì)教程

    mysql8.0.21下載安裝詳細(xì)教程

    這篇文章主要介紹了mysql8.0.21下載安裝詳細(xì)教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • 正確使用MySQL update語(yǔ)句

    正確使用MySQL update語(yǔ)句

    今天我們主要向大家講述的是MySQL update 語(yǔ)句的實(shí)際用法,以及在實(shí)際操作中哪些相關(guān)的操作步驟是值得我們大家注意的。
    2015-08-08
  • 修改Mysql索引長(zhǎng)度限制解決767?byte限制問(wèn)題

    修改Mysql索引長(zhǎng)度限制解決767?byte限制問(wèn)題

    這篇文章主要介紹了修改Mysql索引長(zhǎng)度限制解決767?byte限制問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • 淺談mysql 自定義函數(shù)

    淺談mysql 自定義函數(shù)

    本文主要是分析了一下在工作中寫(xiě)的一個(gè)mysql的自定義函數(shù),很簡(jiǎn)單,僅僅是希望能對(duì)大家理解mysql自定義函數(shù)有所幫助。
    2014-09-09
  • 深入解讀Mysql查詢性能的優(yōu)化

    深入解讀Mysql查詢性能的優(yōu)化

    這篇文章主要介紹了深入解讀Mysql查詢性能的優(yōu)化,如果想要優(yōu)化查詢,就需要優(yōu)化其子任務(wù),要么你就消除其中的一些子任務(wù),要么就減少子任務(wù)的執(zhí)行次數(shù),要么就讓子任務(wù)運(yùn)行的更快,需要的朋友可以參考下
    2023-07-07
  • IDEA的database插件無(wú)法連接mysql的解決辦法(08001錯(cuò)誤)

    IDEA的database插件無(wú)法連接mysql的解決辦法(08001錯(cuò)誤)

    用navicat鏈接數(shù)據(jù)庫(kù)正常,mysql控制臺(tái)操作正常,但是用IDEA的數(shù)據(jù)庫(kù)插件鏈接一直報(bào) 08001 錯(cuò)誤,本文就給大家介紹一下IDEA的database插件無(wú)法連接mysql報(bào)08001錯(cuò)誤的解決辦法,需要的朋友可以參考下
    2024-07-07
  • MySQL修改密碼方法匯總

    MySQL修改密碼方法匯總

    本文中小編給大家匯總介紹了MySQL修改密碼的方法,分為MySQL5.7版本之前以及MySQL5.7版本之后的修改方法,有需要的小伙伴可以參考下
    2018-08-08
  • navicat連接Mysql數(shù)據(jù)庫(kù)報(bào)2013錯(cuò)誤解決辦法

    navicat連接Mysql數(shù)據(jù)庫(kù)報(bào)2013錯(cuò)誤解決辦法

    這篇文章主要介紹了navicat連接Mysql數(shù)據(jù)庫(kù)報(bào)2013錯(cuò)誤的解決辦法,首先檢查MySQL是否安裝成功,然后修改配置文件,添加或注釋掉特定行,最后連接進(jìn)入MySQL服務(wù)并執(zhí)行授權(quán)命令,需要的朋友可以參考下
    2025-02-02

最新評(píng)論

石嘴山市| 台北市| 隆化县| 耒阳市| 车险| 永嘉县| 新野县| 辽源市| 天祝| 昌平区| 维西| 华坪县| 墨脱县| 谢通门县| 揭西县| 兴文县| 临海市| 北票市| 霍城县| 石渠县| 涟水县| 横山县| 电白县| 沧源| 凤凰县| 大同市| 中江县| 曲阳县| 文山县| 阿城市| 元谋县| 衡水市| 会同县| 榆林市| 广平县| 保康县| 礼泉县| 托克逊县| 建宁县| 延安市| 车险|