鍍金池/ 問答/數(shù)據(jù)庫/ 在看《高性能mysql》中的高性能索引策略中有一個(gè)地方不明

在看《高性能mysql》中的高性能索引策略中有一個(gè)地方不明

之前已經(jīng)了解了 "選擇性" 的概念, 知道選擇性一般是加 前綴索引的時(shí)候,用來選合適的前綴長度的, 也知道前綴索引的算法是: 某個(gè)列在某個(gè)前綴下的所有不同值數(shù)量/記錄總數(shù)

前面說的是“列的前綴”, 但下面這個(gè)多列索引, 怎么還有“前綴列”? 前綴列和列前綴一樣?????都有選擇性?

什么叫 "只使用了索引部分前綴列的查詢來說選擇性也更高" ?

首先我看不到斷句在哪里? 是‘索引部分’的前綴列? 還是索引的‘部分前綴列’?

這里怎么扯到選擇性的?

clipboard.png

而且下面, 為什么customer_id的數(shù)量小了, 就排前面了?? 完全沒看出怎么就選擇性大了
clipboard.png

而且后面還有個(gè)地方也很模糊:

clipboard.png

回答
編輯回答
維她命
前面說的是“列的前綴”, 但下面這個(gè)多列索引, 怎么還有“前綴列”? 前綴列和列前綴一樣?????都有選擇性?

列的前綴是說對(duì)于內(nèi)容很長的列,必須使用前綴索引,否則索引將會(huì)變得很大(或者 MySQL 壓根就不允許索引這些列的完整長度)
前綴列是說建了(A,B,C,D)的索引,A 或者 A,B 或者 A,B,C 都叫做前綴列

什么叫 "只使用了索引部分前綴列的查詢來說選擇性也更高" ?

如果你的 D 列選擇性并不高(也就是不同的記錄數(shù)占總記錄數(shù)的比值不高),但是你只使用到了 A,B,C 那么選擇性也是很高的

首先我看不到斷句在哪里? 是‘索引部分’的前綴列? 還是索引的‘部分前綴列’?

應(yīng)該斷句為 索引 的 部分的前綴列

這里怎么扯到選擇性的?

上一節(jié)是多列索引,然后引出了你列出的本節(jié)————選擇合適的索引列順序,再結(jié)合上上一節(jié)的索引選擇性,作者試圖給你分析在使用“多列索引”的情況下,如何提高“索引的選擇性”。

而且下面, 為什么customer_id的數(shù)量小了, 就排前面了?? 完全沒看出怎么就選擇性大了

首先作者分別篩選了 staff_id=2和customer_id=584的情況,customer_id 篩選出的結(jié)果集很少,這也就說明選擇性更高,這句話你如果不理解怎么引出的,上一段你標(biāo)紅那里的下一句就是“然而,性能不只是依賴于所有索引列的選擇性(整體基數(shù)),也和查詢條件的具體值有關(guān),也就是和值的整體分布有關(guān)”

2018年1月6日 03:46
編輯回答
歆久

同樣的數(shù)據(jù)量,某一列的不同值越多,說明選擇性越好,就是說這列的這個(gè)值篩選后的結(jié)果集/行數(shù)最少,就叫選擇性好。
同樣的前綴索引選擇盡量接近總行數(shù)也是為了這一列的同一個(gè)前綴值獲取到的行數(shù)最少,就是更精確的定位行。
復(fù)合/多列索引一般要求把選擇性好的列放前面,就像說(a,b,c)中的a,a就可以叫這個(gè)索引的前綴列,理解意思就行,不用那么糾結(jié)。

2018年3月25日 06:10
編輯回答
櫻花霓

索引是 (a,b,c) 查詢是a,b,d 是可以使用到索引的,但是只是用索引前面的 a,b列,如果查詢是 b,c,d,就無法使用索引了。

2017年3月27日 11:39
編輯回答
艷骨

而且為什么后面使用customer_id作為條件來篩選staff_id,看到此時(shí)staff_id的基數(shù)是17

那么為什么沒有用staff_id作為條件看看customer_id的基數(shù)呢?
總之就是沒看出來第一個(gè)無條件的sql在統(tǒng)計(jì)出各列的基數(shù)后, 為什么customer_id的基數(shù)少就說選擇性好, 基數(shù)好也可能不同值的數(shù)量只有1個(gè), 甚至值全相等, 那選擇性可能最差吧

2017年9月13日 16:17