索引的選擇性

2021-04-16 23:45:51 字數 1551 閱讀 5511

索引的選擇性是指索引列中不同值的數目與表中記錄數的比。如果乙個表中有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的最優化,優化器不應該使用選擇性不好的索引。如果是使用基於...