欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

通過查看執(zhí)行計(jì)劃,也為全索引掃描,sql在執(zhí)行的時(shí)候,會對整個服務(wù)器帶來抖動;

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)在需要換一種思路來解決該問題:

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

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

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

20155893909060.jpg (532×255)

所以需要通過改寫sql來達(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)化器在這個時(shí)候的執(zhí)行計(jì)劃為Using index for group-by ,

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

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

優(yōu)化寫法:

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 |

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

原始寫法:

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)文章

  • Mysql的DQL查詢操作全面分析講解

    Mysql的DQL查詢操作全面分析講解

    DQL(Data Query Language 數(shù)據(jù)查詢語言):用于查詢數(shù)據(jù)庫對象中所包含的數(shù)據(jù)。DQL語言主要的語句:SELECT語句。DQL語言是數(shù)據(jù)庫語言中最核心、最重要的語句,也是使用頻率最高的語句
    2022-12-12
  • MySQL分區(qū)表分區(qū)策略詳解

    MySQL分區(qū)表分區(qū)策略詳解

    這篇文章主要介紹了MySQL分區(qū)表分區(qū)策略詳解,分區(qū)是一種表的設(shè)計(jì)模式,通俗地講表分區(qū)是將一大表,根據(jù)條件分割成若干個小表。但是對于應(yīng)用程序來講,分區(qū)的表和沒有分區(qū)的表是一樣的,需要的朋友可以參考下
    2023-07-07
  • mysql從執(zhí)行.sql文件時(shí)處理\n換行的問題

    mysql從執(zhí)行.sql文件時(shí)處理\n換行的問題

    后來注意到,在上面我們恢復(fù)數(shù)據(jù)的時(shí)候是在沒有連接數(shù)據(jù)的狀態(tài)下執(zhí)行的。
    2009-05-05
  • 阿里云 Centos7.3安裝mysql5.7.18 rpm安裝教程

    阿里云 Centos7.3安裝mysql5.7.18 rpm安裝教程

    這篇文章主要介紹了阿里云 Centos7.3安裝mysql5.7.18 rpm安裝教程,需要的朋友可以參考下
    2017-06-06
  • MySQL性能全面優(yōu)化方法參考,從CPU,文件系統(tǒng)選擇到mysql.cnf參數(shù)優(yōu)化

    MySQL性能全面優(yōu)化方法參考,從CPU,文件系統(tǒng)選擇到mysql.cnf參數(shù)優(yōu)化

    本文整理了一些MySQL的通用優(yōu)化方法,做個簡單的總結(jié)分享,大部分情況下都介紹了適用的場景,如果你的應(yīng)用場景和本文描述的不太一樣,那么建議根據(jù)實(shí)際情況進(jìn)行調(diào)整
    2018-03-03
  • MySql各種查詢方式詳解

    MySql各種查詢方式詳解

    如果是做數(shù)據(jù)分析,MySQL里面最重要、最常用的就是數(shù)據(jù)查詢,數(shù)據(jù)查詢不只是簡單查詢數(shù)據(jù)庫中存儲的數(shù)據(jù),還要根據(jù)需求對數(shù)據(jù)進(jìn)行篩選、聚合,以及確定數(shù)據(jù)以什么樣的格式進(jìn)行顯示。MySQL提供了強(qiáng)大、靈活的語句和函數(shù)來實(shí)現(xiàn)查詢的操作
    2022-07-07
  • Mysql中tinyint(1)和tinyint(4)的區(qū)別詳析

    Mysql中tinyint(1)和tinyint(4)的區(qū)別詳析

    這篇文章主要給大家介紹了關(guān)于Mysql中tinyint(1)和tinyint(4)區(qū)別的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-02-02
  • MySql COALESCE函數(shù)使用方法代碼案例

    MySql COALESCE函數(shù)使用方法代碼案例

    這篇文章主要介紹了MySql COALESCE函數(shù)使用方法代碼案例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • mysql中cast函數(shù)用法小結(jié)

    mysql中cast函數(shù)用法小結(jié)

    在MySQL中,CAST函數(shù)用于將一個表達(dá)式轉(zhuǎn)換為指定的數(shù)據(jù)類型,本文主要介紹了mysql中cast函數(shù)用法小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • you *might* want to use the less safe log_bin_trust_function_creators variable

    you *might* want to use the less safe log_bin_trust_function

    you *might* want to use the less safe log_bin_trust_function_creators variable
    2011-07-07

最新評論