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

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

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

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

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。居然用了使用外部文件進行排序。這個當然慢了。

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

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;

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

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

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

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

相關(guān)文章

  • mysql慢查詢操作實例分析【開啟、測試、確認等】

    mysql慢查詢操作實例分析【開啟、測試、確認等】

    這篇文章主要介紹了mysql慢查詢操作,結(jié)合實例形式分析了mysql慢查詢操作中的開啟、測試、確認等實現(xiàn)方法及相關(guān)操作技巧,需要的朋友可以參考下
    2019-12-12
  • 在MySQL中生成隨機密碼的方法

    在MySQL中生成隨機密碼的方法

    這篇文章主要介紹了在MySQL中生成隨機密碼的方法,作者還給出了密碼所對應類型限制的參數(shù)表,需要的朋友可以參考下
    2015-05-05
  • MYSQL 數(shù)據(jù)庫導入導出命令

    MYSQL 數(shù)據(jù)庫導入導出命令

    在不同操作系統(tǒng)或MySQL版本情況下,直接拷貝文件的方法可能會有不兼容的情況發(fā)生。所以一般推薦用SQL腳本形式導入。下面分別介紹兩種方法。
    2010-11-11
  • MySQL 編碼utf8 與 utf8mb4 utf8mb4_unicode_ci 與 utf8mb4_general_ci

    MySQL 編碼utf8 與 utf8mb4 utf8mb4_unicode_ci 與 utf8mb4_general_

    這篇文章主要介紹了MySQL 編碼utf8 與 utf8mb4 utf8mb4_unicode_ci 與 utf8mb4_general_ci的相關(guān)知識,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-05-05
  • mysql5.7安裝及配置教程

    mysql5.7安裝及配置教程

    這篇文章主要為大家詳細介紹了mysql5.7安裝及配置教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • 深入講解數(shù)據(jù)庫中Decimal類型的使用以及實現(xiàn)方法

    深入講解數(shù)據(jù)庫中Decimal類型的使用以及實現(xiàn)方法

    MySQL?DECIMAL數(shù)據(jù)類型用于在數(shù)據(jù)庫中存儲精確的數(shù)值,我們經(jīng)常將DECIMAL數(shù)據(jù)類型用于保留準確精確度的列,例如會計系統(tǒng)中的貨幣數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于數(shù)據(jù)庫中Decimal類型的使用以及實現(xiàn)方法的相關(guān)資料,需要的朋友可以參考下
    2022-02-02
  • 原來MySQL?數(shù)據(jù)類型也可以優(yōu)化

    原來MySQL?數(shù)據(jù)類型也可以優(yōu)化

    這篇文章主要介紹了原來MySQL?數(shù)據(jù)類型也可以優(yōu)化,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下,希望對你的學習有所幫助
    2022-08-08
  • 一文帶你探究MySQL中的NULL

    一文帶你探究MySQL中的NULL

    我們在日常工作中如果要接觸Mysql數(shù)據(jù)庫,那么不可避免會遇到Mysql中,下面這篇文章主要給大家介紹了關(guān)于MySQL中NULL的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2021-11-11
  • Windows11下MySQL?8.0.29?安裝配置方法圖文教程

    Windows11下MySQL?8.0.29?安裝配置方法圖文教程

    這篇文章主要為大家詳細介紹了Windows11下MySQL?8.0.29?安裝配置方法圖文教程,文中安裝步驟介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • mysql之innodb的鎖分類介紹

    mysql之innodb的鎖分類介紹

    本文將介紹mysql之innodb的鎖分類,需要了解更多的朋友可以參考下
    2012-11-11

最新評論

宕昌县| 江都市| 本溪| 廊坊市| 东阳市| 龙泉市| 泰顺县| 甘谷县| 龙泉市| 綦江县| 大同市| 长宁县| 大庆市| 蕲春县| 锡林浩特市| 本溪| 江油市| 大庆市| 湛江市| 凌源市| 密山市| 海兴县| 永昌县| 大名县| 奎屯市| 海城市| 福建省| 浦城县| 灌阳县| 西贡区| 涞源县| 乌兰县| 永和县| 桐梓县| 梅州市| 阳信县| 仁怀市| 阜阳市| 天峻县| 社旗县| 伊宁市|