Mysql索引总结
日期类型可以直接和string格式的字符串比较
select * from xxx where event_time>'2018-06-02' 可以使用索引, mysql默认会把后面的字符串转成date类型。可以使用between and
select * from xxx where date(event_time)>'2018-06-02' 不能使用索引
如果时间戳日期和时间都要比较, 最好使用两个字段保存这个时间戳, 这样可以利用索引
select * from xxx where event_time>1239237428734; -- 使用错误, 不能这么用。可以使用from_unixtime()将数字转成日期类型
将date和time合并成一个datetime
select str_to_date(concat(ICDate,' ',ICTime),'%m/%d/%y %h:%i:%s %s') from XXXX
其他索引总结:
where条件等号两边字段类型不同,不走索引
like 'XXX%' 走索引, '%XXX%'不走索引
对字段进行函数运算不走索引
组合索引 只使用后面的字段不走索引,使用前后的字段走索引. 第一个字段有参于(而且字段类型匹配 没有函数运算),那么会走索引, 第一个字段可以在sql中的任意位置
组合索引遇到第一个不等值条件 即中断后面字段使用索引
字段类型不匹配,不走索引
示例:
name varchar, addr varchar, age int。 创建组合索引为name + addr + age
select * from t_user where name like '123%' and age>19; 走索引 type=range
select * from t_user where age>19 and name like '123%' ; 走索引 type=range
select * from t_user where name =123 不走索引 type=all
select * from t_user where name='123' 走索引 type=ref
select * from t_user where addr like '上城%' and age>30; 不走索引 type=all
explain 是否使用了索引
type=ALL是全表扫描
只要不是ALL, 都能使用索引,只是使用索引的方式不同,性能也有差异==>依次从好到差:system,const,eq_ref,ref,fulltext,ref_or_null,unique_subquery,index_subquery,range,index_merge,index,ALL
关于explain各个字段的解释:https://www.cnblogs.com/david97/p/8072164.html
索引不是越多越好, 两个index进行merge有时还不如只使用一个index
组合索引创建的依据:select distinct(xxx)/count(*) 值越大说明区分度越高 组合索引的价值越高
什么时候创建组合索引? 单列上查询出来的数据量都很大,但是两个组合查询的结果很小 ,此时创建组合索引就比较有意义
(原始的离线度都小,组合的离散度会大???) 0.8*0.8=0.64 0.8*0.5=0.4 如果整体的数据量级别很大,也有点效果
索引的类型
BTREE的时间复杂度: https://blog.csdn.net/weixin_38399962/article/details/79409118
orderby 是否使用索引
https://my.oschina.net/u/912810/blog/325177
orderby用到的索引和where中的索引如果一致, 可以提升不少性能
字符类型的索引需要指定长度
ALTER TABLE t_yyy ADD INDEX `xxx` (`request_type` ASC, `request_param`(15) ASC);
转载于:https://www.cnblogs.com/yszzu/p/9255769.html