where id+1 = 5; 或者 where TO_DAYS(date) -TO_DAYS(date1) <10
使用select count (*) as cnt ,LEFT(name,3)as pref from table group by pref order by cnt limit 10;这样的语句来看分布,如果显示的cnt数量太多,那就加大LFET(name,7)直到合适为止,假如7这个数字合适,那么就创建索引:
alter table table add key (name(7));不过group by 和 order by都不支持这种索引,也无法使用这种索引做覆盖扫描。
将选择性最高的列放在放到索引最前列,一个字段sex,选择性就两个,一个男,一个女,即使查询出来结果集也是很多的,尽量把选择性多的列放在前面,比如县的名字,这样比sex好的多了,因为我国有很多县,就是县这个字段区分度大,sex区分度太小了。这样的话where语句就可以过滤出需要的行数据了。例如下列的查询语句:
select * from t where staff_id = 2 and customer_id = 584;
针对这个语句的索引如何建立呢?
首先 select SUM(staff_id = 2),SUM(customer_id = 584) from t;
假如结果是 SUM(staff_id = 2)=7992 , SUM(customer_id = 584)=30
那么就应该将索引列 customer_id,放在组合索引(customer_id,staff_id)的第一个位置,先筛选符合条件的30个,然后再从这30个里筛选符合条件的 staff_id ,比先筛选符合条件的7992个,再从这7992个里筛选符合条件的customer_id ,性能要高的多。
但是这样的查询结果依赖具体的数字,比如上面例子中的 2 和 584。正确的做法是:
select count(distinct staff_id) / count(*) as X,count(distinct customer_id) / count(*) as Y,count(*), from table。
结果是: X:0.0001 Y:0.0373 count(*):16049
这样看下来刚才选择的 customer_id 是明智的选择
如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!
加入交流群
请使用微信扫一扫!