索引使用原則 列的離散(s n)度

2021-10-19 19:41:55 字數 1083 閱讀 2872

第乙個叫做列的離散度,我們先來看一下列的離散度的公式:

count(distinct(column_name)) : count(*),列的全部不同值和所有資料行的比例。資料行數相同的情況下,分子越大,列的離散度就越高。

簡單來說,如果列的重複值越多,離散度就越低,重複值越少,離散度就越高。

了解了離散度的概念之後,我們再來思考乙個問題,我們在name 上面建立索引和在gender 上面建立索引有什麼區別。

當我們用在gender 上建立的索引去檢索資料的時候,由於重複值太多,需要掃瞄的行數就更多。例如,我們現在在gender 列上面建立乙個索引,然後看一下執行計畫。

alter table user_innodb drop index idx_user_gender;

alter table user_innodb add index idx_user_gender (gender); -- 耗時比較久

explain select * from `user_innodb` where gender = 0;

show indexes from user_innodb;
而name 的離散度更高,比如「青山」的這名字,只需要掃瞄一行。

alter table user_innodb drop index idx_user_name;

alter table user_innodb add index idx_user_name (name);

explain select * from `user_innodb` where name = 'leon';

檢視表上的索引,cardinality [kɑ:dɪ'nælɪtɪ] 代表基數,代表預估的不重複的值的數量。索引的基數與表總行數越接近,列的離散度就越高。

show indexes from user_innodb;
如果在b+tree 裡面的重複值太多,mysql 的優化器發現走索引跟使用全表掃瞄差不了多少的時候,就算建了索引,也不一定會走索引。

這個給我們的啟發是什麼?建立索引,要使用離散度(選擇度)更高的字段。

索引的使用原則

在where子句或者連線條件經常引用的列上建立索引,特別是大表的字段,應該建立索引。經常出現在關鍵字group by order by distinct後面的字段,最好建立索引。表的主鍵 外來鍵必須建立索引。建立了主鍵和唯一性約束後會自動建立唯一索引。如果單字段查詢很少甚至沒有,那麼可以建立復合索引...

loc,iloc,列索引,布林索引的使用

結論 1,loc,iloc,df.ename,df ename df ename 都是引用的方式進行訪問,也就是說被引用的資料發生改變,那麼df資料也會發生改變 2,如果只拿一列 乙個特徵值 資料,那麼返回的一般是series型別,達到兩列或者以上,一般是dataframe型別 3,loc 0 1,...

mysql單列索引 多列索引的使用

資料庫的索引可以加快查詢速度,原因是索引使用特定的資料結構 b tree 對特定的列額外組織存放,加快儲存引擎 索引是儲存引擎實現 查詢記錄的速度。索引優化是資料庫優化的最重要手段。如果查詢語句使用索引 通常是where條件匹配索引 就會利用樹的結構加快查詢,索引會按值查詢到要查詢的行在表中位置,不...