MySQL之索引 索引欄位的選取

2021-08-08 04:29:13 字數 1276 閱讀 5406

日常在建資料表的時候,通常會在where,group by,order by等常用的字段上建立索引,當有多個字段時候,有一項原則就是該字段的去重後的值個數越多,索引建立的必要性越強。

這裡建立一張資料表,有staff_id和leader_id兩個字段,通過explain分析可以驗證哪個欄位更適合做索引。

create table `test_index_distinct_value` (

`id` int(11) not null auto_increment,

`staff_id` int(11) default null,

`leader_id` int(11) default null,

`remark` varchar(255) default null,

primary key (`id`)

) engine=innodb auto_increment=1 default charset=utf8;

插入若干條資料:

通過一條sql先對比下staff_id和leader_id去重後的值個數與總行數的佔比:

select count(distinct(staff_id))/count(*) as staff_rate,

count(distinct(leader_id))/count(*) as leader_rate

from test_index_distinct_value

查詢結果:

可以看到去重後的數值staff_id要高於leader_id的個數。

下面先在staff_id欄位上建立索引,用explain分析一條普通的查詢sql語句:

explain

select *

from test_index_distinct_value

where leader_id=2 and staff_id=22

拆除staff_id欄位上的索引,在leader_id欄位上建立,繼續用explain分析分析上條查詢sql語句:

可以看出同樣使用了索引查詢執行同樣的sql語句,在leader_id欄位上建立的索引需要掃瞄3行資料,而在staff_id欄位建立索引時,僅需掃瞄1行資料,驗證可去重後數值越多索引效率越高。

當然這個原則僅僅是作為一項參考,具體的還需要跟對應業務相結合。

mysql欄位索引

drop table if exists auth assignment drop table if exists auth item child drop table if exists auth item drop table if exists auth rule create table a...

建立索引該如何選取字段

建立索引應選取什麼字段,原則 1 在where子句中最頻繁使用的字段 2 聯接語句中的聯接字段 3 選擇高選擇性的字段 如果很少的字段擁有相同值 即有很多獨特值 則選擇性很好 4 在選擇性很差的字段上建索引只有在這個欄位的值分布非常傾斜的情況下才有益 在這種情況下,某一 兩個字段值比其它欄位值少出現...

mysql欄位簡索引 MySQL中索引使用簡例

一張表最多不超過4個索引 某個欄位的值離散度越高,該字段越適合做索引的關鍵字。占用儲存空間少的字段更適合選做索引的關鍵字。較頻繁的作為where查詢條件的字段應該建立索引,分組字段或者排序字段應該建立索引,兩個表的連線字段應該建立索引。更新頻繁的字段不適合做索引,不會出現在where中的字段不應該建...