MySQL 前綴索引

MySQL 前綴索引

當(dāng)要索引的列字符很多時(shí) 索引則會很大且變慢
( 可以只索引列開始的部分字符串 節(jié)約索引空間 從而提高索引效率 )

原則: 降低重復(fù)的索引值

例如現(xiàn)在有一個(gè)地區(qū)表

area gdp code
chinaShanghai 100 aaa
chinaDalian 200 bbb
usaNewYork 300 ccc
chinaFuxin 400 ddd
chinaBeijing 500 eee

發(fā)現(xiàn) area 字段很多都是以 china 開頭的
那么如果以前1-5位字符做前綴索引就會出現(xiàn)大量索引值重復(fù)的情況
索引值重復(fù)性越低 查詢效率也就越高


前綴索引測試

// 創(chuàng)建一個(gè)測試表
CREATE TABLE `x_test` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `x_name` varchar(255) NOT NULL,
  `x_time` int(10) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4145025 DEFAULT CHARSET=utf8mb4

// 添加200萬條測試數(shù)據(jù)
INSERT INTO x_test(x_name,x_time) SELECT CONCAT(rand()*3300102,x_name),x_time FROM x_test WHERE id < 30000;
200萬 測試數(shù)據(jù)
  1. 在無任何索引的情況下隨便查詢一條
    SELECT * FROM x_test WHERE x_name = '1892008.205824857823401.800099203178258.8904820949682635656.62526521254';
    查詢時(shí)間:2.253s

  2. 添加前綴索引 ( 以第一位字符創(chuàng)建前綴索引 )
    alter table x_test add index(x_name(1))
    再次查詢相同sql語句
    SELECT * FROM x_test WHERE x_name = '1892008.205824857823401.800099203178258.8904820949682635656.62526521254';
    查詢時(shí)間:3.291s
    當(dāng)使用第一位字符創(chuàng)建前綴索引后 貌似查詢的時(shí)間更長了
    因?yàn)橹坏谝晃蛔址运饕档闹刈x性太大了
    200萬條數(shù)據(jù)全以數(shù)字開頭那么平均20萬條的數(shù)據(jù)都是相同的索引值

  3. 重新建立前綴索引 這次以前4位字符來創(chuàng)建
    alter table x_test add index(x_name(4));
    再次查詢相同sql語句
    SELECT * FROM x_test WHERE x_name = '1892008.205824857823401.800099203178258.8904820949682635656.62526521254';
    查詢時(shí)間:0.703s
    這次以前4位創(chuàng)建索引 大大減少了索引值的重復(fù)性 查詢速度從3秒提升到0.7秒

  4. 200萬條數(shù)據(jù)都以數(shù)字開頭 而0-9排列組合7位則可達(dá)到千萬種組合
    也就是以前7位來做索引則不會出現(xiàn)重復(fù)索引值的情況了
    alter table x_test add index(x_name(7));
    再次查詢相同sql語句
    SELECT * FROM x_test WHERE x_name = '1892008.205824857823401.800099203178258.8904820949682635656.62526521254';
    查詢時(shí)間:0.014s ( 首次執(zhí)行無緩存狀態(tài)下 )


MySQL 5.7 參考手冊 - 前綴索引

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本文轉(zhuǎn)載自http://blog.jobbole.com/24006/ 摘要本文以MySQL數(shù)據(jù)庫為研究對象,討論...
    海納百川_spark閱讀 4,536評論 3 135
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,551評論 19 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,673評論 18 399
  • 50個(gè)常用的sql語句Student(S#,Sname,Sage,Ssex) 學(xué)生表Course(C#,Cname...
    哈哈海閱讀 1,334評論 0 7
  • 還是這個(gè)主題,講真真的不知道怎么寫,不過打開簡書看到一篇很棒的文章,如何利用框架思維整理碎片化的知識,關(guān)...
    帥氣的昵稱長啥樣子閱讀 252評論 0 1

友情鏈接更多精彩內(nèi)容