日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

mysql索引 钱缀_【mysql索引】之前缀索引-Go语言中文社区

發(fā)布時(shí)間:2025/3/21 59 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql索引 钱缀_【mysql索引】之前缀索引-Go语言中文社区 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

第零步:簡(jiǎn)單說(shuō)一說(shuō)

有時(shí)候需要索引很長(zhǎng)的字符(例如BLOB,TEXT,或者很長(zhǎng)的VARCHAR),這樣會(huì)使得索引又大又慢。

改良方法有:1.改用哈希索引(這里不講)。2.使用字符串的前幾個(gè)字符作為索引(即前綴索引)。

下面具體主要說(shuō)第2種方法,主要思路就是選擇足夠長(zhǎng)的前綴以保證較高的選擇性,同時(shí)又不能太長(zhǎng)(造成空間浪費(fèi))。

所謂選擇性,是指不重復(fù)的索引數(shù)量除以總記錄數(shù),范圍是(0,1],唯一索引之所以查詢效率高,是因?yàn)樗倪x擇性等于1。首先要做的是準(zhǔn)備好足夠的數(shù)據(jù)來(lái)進(jìn)行測(cè)試,最簡(jiǎn)單的方法是:

我們剛安裝好MySQL的時(shí)候,會(huì)有一個(gè)叫sakila的數(shù)據(jù)庫(kù),這個(gè)數(shù)據(jù)庫(kù)可以方便我們進(jìn)行各種練習(xí)。

下面我們直接開始行動(dòng)~用Navicat打開sakila數(shù)據(jù)庫(kù)(沒(méi)有Navicat?那就命令行use sakila吧)

第一步:建立測(cè)試表及其數(shù)據(jù)

-- 新建一個(gè)測(cè)試表city_demo,并把表city的數(shù)據(jù)復(fù)制過(guò)去

INSERT INTO city_demo SELECT city FROM city;

-- 把表city_demo自身的數(shù)據(jù)復(fù)制5次,即反復(fù)執(zhí)行下面這句語(yǔ)句5次

INSERT INTO city_demo SELECT city FROM city_demo;

-- 將表里面的城市名隨機(jī)打亂(這一步生成的結(jié)果會(huì)與我之后展示的數(shù)據(jù)有差別,但并不影響分析)

UPDATE city_demo SET city = (SELECT city FROM city ORDER BY RAND() LIMIT 1);

第二步:計(jì)算合適的前綴索引長(zhǎng)度

有兩種方法計(jì)算長(zhǎng)度

方法一:

-- 查詢重復(fù)次數(shù)最多的10條完整城市名稱及其數(shù)量(圖1)

SELECT COUNT(*) cnt, city FROM city_demo GROUP BY city ORDER BY cnt DESC LIMIT 10;

-- 查詢重復(fù)次數(shù)最多的10條城市名稱(前3個(gè)字符)及其數(shù)量,可以發(fā)現(xiàn):前3個(gè)字符的相同數(shù)量過(guò)大,不適合做前綴索引(圖2)

SELECT COUNT(*) cnt, LEFT(city,3) pref FROM city_demo GROUP BY pref ORDER BY cnt DESC LIMIT 10;

-- 查詢重復(fù)次數(shù)最多的10條城市名稱(前7個(gè)字符)及其數(shù)量,可以發(fā)現(xiàn):前7個(gè)字符的相同數(shù)量和完整城市名稱很相近了,可以考慮作為做前綴索引(圖3)

SELECT COUNT(*) cnt, LEFT(city,7) pref FROM city_demo GROUP BY pref ORDER BY cnt DESC LIMIT 10;

圖1:

圖2:

圖3:

方法二:

-- 計(jì)算出完整字符串的選擇性(圖4)

SELECT COUNT(DISTINCT city)/COUNT(*) FROM city_demo;

-- 計(jì)算各個(gè)前綴的選擇性(圖5),然后找出選擇性與圖4相近的

SELECT

COUNT(DISTINCT LEFT(city,3))/COUNT(*) pref3,

COUNT(DISTINCT LEFT(city,4))/COUNT(*) pref4,

COUNT(DISTINCT LEFT(city,5))/COUNT(*) pref5,

COUNT(DISTINCT LEFT(city,6))/COUNT(*) pref6,

COUNT(DISTINCT LEFT(city,7))/COUNT(*) pref7

FROM city_demo;

圖4:

圖5:

不過(guò)pref4和pref5是一個(gè)陷阱,因?yàn)樗鼈兛瓷先ヒ呀?jīng)很接近完整字符串的選擇性了,但是我們可以用方法一來(lái)看一下:

-- 結(jié)果看圖6

SELECT COUNT(*) cnt, LEFT(city,4) pref4 FROM city_demo GROUP BY pref4 ORDER BY cnt DESC LIMIT 5;

-- 結(jié)果看圖7

SELECT COUNT(*) cnt, LEFT(city,5) pref5 FROM city_demo GROUP BY pref5 ORDER BY cnt DESC LIMIT 5;

圖6:

圖7:

可以看出,前綴4和5的分布還是不均勻的以Sant、South為首的城市仍然比較多,結(jié)合方法一、二,可以建立長(zhǎng)度為7的前綴索引了

第三步:建立前綴索引

ALTER TABLE `city_demo` ADD INDEX `idx_city` (`city`(7)) USING BTREE ;

-- 或者這個(gè)也行

ALTER TABLE `city_demo` ADD KEY `idx_city` (`city`(7))

-- 又或者直接用Navicat可視化操作也行

前綴索引的缺點(diǎn)

MySQL中無(wú)法使用前綴索引進(jìn)行ORDER BY和GROUP BY,也無(wú)法用來(lái)進(jìn)行覆蓋掃描

總結(jié)

以上是生活随笔為你收集整理的mysql索引 钱缀_【mysql索引】之前缀索引-Go语言中文社区的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。