mysql 索引建立准则

问题:建立索引令staff_id还是customer_id在前?

准则1经验准则:第一个索引筛选后,留下尽可能少的数据。

SELECT SUM(staff_id=2),Sum(customer_id=584) FROM payment

SUM(staff_id=2):7992   Sum(customer_id=584):30


所以customer_id对应条件值后,数目更少

但是经验准则非常依赖于具体值,所以我们一般使用准则2,令全局尽可能最优

准则2:选择性高的列,放在前面

SLECT COUNT(DISTINCT staff_id)/count(*)  AS staff_id_selectivity,

COUNT(DISTINCT customer_id)/count(*) AS customer_id_selectivity,

COUNT(*)

FROM payment

========================

staff_id_selectivity:0.0001

customer_id_selectivity:0.0373

COUNT(*):16049

customer_id选择性更高(也就是指定具体值后,出来的条目更少),所以将customer_id作为索引的第一列

选择性定义:不同值的条目/总条目,就是 可选择的东西的多少的意思。

注意,可能有一个问题,customer_id如果可选择性很高,但是其中某一个customer_id的数据条目非常多(比如customer_id=0代表未登录的客户),刚好未登录的客户又占大多数,

这个时候用这个索引顺序查找就会失效。

解决办法是在程序中禁止对这个id进行查找。

猜你喜欢

转载自www.cnblogs.com/yjybupt/p/12714085.html