索引的選擇性是指索引列中不同值的數目與表中記錄數的比。如果乙個表中有2000條記
錄,表索引列有1980個不同的值,那麼這個索引的選擇性就是1980/2000=0.99。
乙個索引的選擇性越接近於1,這個索引的效率就越高。
如果是使用基於cost的最優化,優化器不應該使用選擇性不好的索引。如果是使用基於
rule的最優化,優化器在確定執行路徑時不會考慮索引的選擇性(除非是唯一性索引),並
且不得不手工優化查詢以避免使用非選擇性的索引。
確定索引的選擇性,可以有兩種方法:手工測量和自動測量。
(1)手工測量索引的選擇性
如果要根據乙個表的兩列建立兩列並置索引,可以用以下方法測量索引的選擇性:
列的選擇性=不同值的數目/行的總數 /* 越接近1越好 */
select count(distinct 第一列||'%'||第二列)/count(*)
from 表名
/ select count(distinct status||'%'||owner)/count(*)
from test;
/ 如果我們知道其中一列索引的選擇性(例如其中一列是主鍵),那麼我們就可以知道另一列索引的選擇性。
手工方法的優點是在建立索引前就能評估索引的選擇性。
(2)自動測量索引的選擇性
如果分析乙個表,也會自動分析所有表的索引。
第一,為了確定乙個表的確定性,就要分析表。
analyze table 表名 compute statistics
/ 第二,確定索引裡不同關鍵字的數目:
select distinct_keys
from user_indexes
where table_name='表名'
and index_name='索引名'
/ 第三,確定表中行的總數:
select num_rows
from user_tables
where table_name='表名'
/ 第四,索引的選擇性=索引裡不同關鍵字的數目/表中行的總數:
select i.distinct_keys/t.num_rows
from
user_indexes i,
user_tables t
where i.table_name='表名'
and i.index_name='索引名'
and i.table_name=t.table_name
/ 第五,可以查詢user_tab_columns以了解每個列的選擇性。
表中所有行在該列的不同值的數目:
select
column_name,
num_distinct
from user_tab_columns
where table_name='表名'
/ 列的選擇性=num_distinct/表中所有行的總數,查詢user_tab_columns有助測量每個列
的選擇性,但它並不能精確地測量列的並置組合的選擇性。要想測量一組列的選擇性,需要
採用手工方法或者根據這組列建立乙個索引並重新分析表。
索引 選擇性
索引的選擇性是指索引列中不同值的數目與表中記錄數的比。如果乙個表中有2000條記 錄,表索引列有1980個不同的值,那麼這個索引的選擇性就是1980 2000 0.99。乙個索引的選擇性越接近於1,這個索引的效率就越高。如果是使用基於cost的最優化,優化器不應該使用選擇性不好的索引。如果是使用基於...
mysql選擇性 Mysql索引的選擇性
對於索引的使用,mysql並不一直都是用採用正確的決定的。參考乙個簡單的表 create table r2 id int 11 default null,id1 int 11 default null,cname varchar 32 default null,key id1 id1 engine ...
索引的選擇性
索引的選擇性是指索引列中不同值的數目與表中記錄數的比。如果乙個表中有2000條記 錄,表索引列有1980個不同的值,那麼這個索引的選擇性就是1980 2000 0.99。乙個索引的選擇性越接近於1,這個索引的效率就越高。如果是使用基於cost的最優化,優化器不應該使用選擇性不好的索引。如果是使用基於...