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

MySQL前綴索引導(dǎo)致的慢查詢分析總結(jié)

 更新時(shí)間:2013年05月19日 16:12:15   作者:  
前綴索引,并不是一個(gè)萬(wàn)能藥,他的確可以幫助我們對(duì)一個(gè)寫過長(zhǎng)的字段上建立索引。但也會(huì)導(dǎo)致排序(order by ,group by)查詢上都是無(wú)法使用前綴索引的
前端時(shí)間跟一個(gè)DB相關(guān)的項(xiàng)目,alanc反饋有一個(gè)查詢,使用索引比不使用索引慢很多倍,有點(diǎn)毀三觀。所以跟進(jìn)了一下,用explain,看了看2個(gè)查詢不同的結(jié)果。

不用索引的查詢的時(shí)候結(jié)果如下,實(shí)際查詢中速度比較塊。
復(fù)制代碼 代碼如下:

mysql> explain select * from rosterusers limit 10000,3 ;

+----+-------------+-------------+------+---------------+------+---------+------+---------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------------+------+---------------+------+---------+------+---------+-------+
| 1 | SIMPLE | rosterusers | ALL | NULL | NULL | NULL | NULL | 2010066 | |
+----+-------------+-------------+------+---------------+------+---------+------+---------+-------+

而使用索引order by的查詢結(jié)果如下,速度反而慢的驚人。
mysql> explain select * from rosterusers order by username limit 10000,3 ;
+----+-------------+-------------+------+---------------+------+---------+------+---------+----------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------------+------+---------------+------+---------+------+---------+----------------+
| 1 | SIMPLE | rosterusers | ALL | NULL | NULL | NULL | NULL | 2010087 | Using filesort |
+----+-------------+-------------+------+---------------+------+---------+------+---------+----------------+

區(qū)別在于,使用索引查詢的Extra變成了,Using filesort。居然用了使用外部文件進(jìn)行排序。這個(gè)當(dāng)然慢了。

但數(shù)據(jù)表上在username,的確是有索引的。怎么會(huì)反而要Using filesort?
看了一下數(shù)據(jù)表定義。是一個(gè)開源聊天服務(wù)器ejabberd的一張表。初看以為主鍵i_rosteru_user_jid是username,和jid的聯(lián)合索引,那么使用order by username時(shí)應(yīng)該是可以使用到索引才對(duì)呀?
復(fù)制代碼 代碼如下:

CREATE TABLE `rosterusers` (
`username` varchar(250) NOT NULL,
`jid` varchar(250) NOT NULL,
UNIQUE KEY `i_rosteru_user_jid` (`username`(75),`jid`(75)),
KEY `i_rosteru_jid` (`jid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

仔細(xì)檢查突然發(fā)現(xiàn)其主鍵定義,不是定義的完整的主鍵名稱,而跟了一個(gè)75的長(zhǎng)度描述,稍稍一愣,原來(lái)用的是前綴索引,而不是整個(gè)字段都是索引。(我的記憶里面InnoDB還不支持這玩意,估計(jì)是4.0后什么版本加入的),前綴索引就是將數(shù)據(jù)字段中前面N個(gè)字節(jié)作為索引的一種方式。

發(fā)現(xiàn)了這個(gè)問題后,我們開始懷疑慢查詢和這個(gè)索引有關(guān),前綴索引的主要用途在于有時(shí)字段過程,而MySQL支持的很多索引長(zhǎng)度是有限制的。
首先不帶order by 的limit 這種查詢,本質(zhì)可能還是和主鍵相關(guān)的,因?yàn)镸ySQL 的INNODB的操作實(shí)際都是依靠主鍵的(即使你沒有建立,系統(tǒng)也會(huì)有一個(gè)默認(rèn)的),而limit這種查詢,使用主鍵是可以加快速度,(explain返回的rows 應(yīng)該是一個(gè)參考值),雖然我沒有看見什么文檔明確的說(shuō)明過這個(gè)問題,但從不帶order by 的limit 查詢的返回結(jié)果基本可以證明這點(diǎn)。

但當(dāng)我們使用order by username的時(shí)候,由于希望使用的是username的排序,而不是username(75)的排序,但實(shí)際索引是前綴索引,不是完整字段的索引。所以反而導(dǎo)致了order by的時(shí)候完全無(wú)法利用索引了。(我在SQL語(yǔ)句里面增加強(qiáng)制使用索引i_rosteru_user_jid也不起作用)。而其實(shí)使用中,表中的字段username 連75個(gè)都用不到,何況定義的250的長(zhǎng)度。完全是自己折騰導(dǎo)致的麻煩。由于這是其他產(chǎn)品的表格,我們無(wú)法更改,暫時(shí)只能先將就用不不帶排序的查詢講究。

總結(jié)
•前綴索引,并不是一個(gè)萬(wàn)能藥,他的確可以幫助我們對(duì)一個(gè)寫過長(zhǎng)的字段上建立索引。但也會(huì)導(dǎo)致排序(order by ,group by)查詢上都是無(wú)法使用前綴索引的。
•任何時(shí)候,對(duì)于DB Schema定義,合理的規(guī)劃自己的字段長(zhǎng)度,字段類型都是首要的事情。

相關(guān)文章

  • MySQL壓測(cè)神器HammerDB的部署及使用詳解

    MySQL壓測(cè)神器HammerDB的部署及使用詳解

    HammerDB?是一個(gè)開源的數(shù)據(jù)庫(kù)負(fù)載測(cè)試和基準(zhǔn)測(cè)試工具,同時(shí)支持?Windows?和?Linux?平臺(tái),這篇文章主要介紹了MySQL壓測(cè)神器HammerDB的部署及使用,需要的朋友可以參考下
    2022-08-08
  • mysql 5.7.9 免安裝版配置方法圖文教程

    mysql 5.7.9 免安裝版配置方法圖文教程

    這篇文章主要為大家分享了mysql 5.7.9 免安裝版配置方法圖文教程,感興趣的小伙伴們可以參考一下
    2016-08-08
  • 簡(jiǎn)單了解MySQL SELECT執(zhí)行順序

    簡(jiǎn)單了解MySQL SELECT執(zhí)行順序

    MySQL數(shù)據(jù)據(jù)庫(kù)中我們經(jīng)常使用SQL SELECT語(yǔ)句來(lái)查詢數(shù)據(jù),那么關(guān)于它的執(zhí)行順序,下面小編來(lái)帶大家簡(jiǎn)單了解一下
    2019-05-05
  • linux(Centos7)下安裝mysql8.0.18的教程圖解

    linux(Centos7)下安裝mysql8.0.18的教程圖解

    這篇文章主要介紹了linux(Centos7)安裝mysql8.0.18的教程,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-11-11
  • MYSQL必知必會(huì)讀書筆記第十和十一章之使用函數(shù)處理數(shù)據(jù)

    MYSQL必知必會(huì)讀書筆記第十和十一章之使用函數(shù)處理數(shù)據(jù)

    這篇文章主要介紹了MYSQL必知必會(huì)讀書筆記第十和十一章之使用函數(shù)處理數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下
    2016-05-05
  • MySQL過濾數(shù)據(jù)操作方法梳理

    MySQL過濾數(shù)據(jù)操作方法梳理

    數(shù)據(jù)庫(kù)表一般包含大量的數(shù)據(jù),很少需要檢索表中的所有行。通常只是根據(jù)特定的需要提取表數(shù)據(jù)的子集。因此檢索所需數(shù)據(jù)時(shí)需要指定搜索條件,搜索條件也稱為過濾條件
    2022-10-10
  • MySQL prepare原理詳解

    MySQL prepare原理詳解

    這篇文章主要介紹了MySQL prepare的相關(guān)內(nèi)容,包括prepare的產(chǎn)生,在服務(wù)器端的執(zhí)行過程,以及jdbc對(duì)prepare的處理以及相關(guān)測(cè)試,需要的朋友可以了解下。希望對(duì)大家有所幫助。
    2017-09-09
  • 如何徹底刪除mysql服務(wù)(清理注冊(cè)表)詳解

    如何徹底刪除mysql服務(wù)(清理注冊(cè)表)詳解

    這篇文章主要給大家介紹了關(guān)于如何徹底刪除mysql服務(wù)(清理注冊(cè)表)的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用mysql具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Node-Red實(shí)現(xiàn)MySQL數(shù)據(jù)庫(kù)連接的方法

    Node-Red實(shí)現(xiàn)MySQL數(shù)據(jù)庫(kù)連接的方法

    這篇文章主要介紹了Node-Red實(shí)現(xiàn)MySQL數(shù)據(jù)庫(kù)連接的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • Mysql數(shù)據(jù)庫(kù)常用命令操作大全

    Mysql數(shù)據(jù)庫(kù)常用命令操作大全

    這篇文章主要介紹了Mysql常用命令操作方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03

最新評(píng)論