索引 選擇性

2021-06-07 16:48:49 字數 1551 閱讀 6927

索引的選擇性是指索引列中不同值的數目與表中記錄數的比。如果乙個表中有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有助測量每個列

的選擇性,但它並不能精確地測量列的並置組合的選擇性。要想測量一組列的選擇性,需要

採用手工方法或者根據這組列建立乙個索引並重新分析表。

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 ...

字首索引 索引選擇性

字首索引 索引選擇性 如果有很長的字元,如 blog,text,如果索引這個列,索引會很大,而且 mysql 也不支援對這種列進行索引.所以需要字首索引,對這些索引的前面幾個字元進行索引.為了讓這種索引效率最高,也就是查詢出來的結果最真實,先要確定需要索引前面幾個字元.示例 select count...

索引的選擇性

索引的選擇性是指索引列中不同值的數目與表中記錄數的比。如果乙個表中有2000條記 錄,表索引列有1980個不同的值,那麼這個索引的選擇性就是1980 2000 0.99。乙個索引的選擇性越接近於1,這個索引的效率就越高。如果是使用基於cost的最優化,優化器不應該使用選擇性不好的索引。如果是使用基於...