索引列上不能使用表达式或函数
select….from product
where to_days(out_date)-to_days(current_date)<=30;
索引优化策略
-
- select….from product out_date<=date_add(current_data,interval 30 day);
前缀索引和索引列的选择性
create index index_name on table (col_name(n));
索引的选择性是不重复的索引值和表的记录数的比值。
联合索引
如何选择索引列的顺序
经常会被使用到的列优先
选择性高的列优先
宽度小的列优先
覆盖索引
优点
可以优化缓存,减少磁盘IO操作;
可以减少随机IO,随机IO操作变为顺序IO操作;
可以避免对Innoddb主键索引的二次查询;
可以避免MyISAM表进行系统调用;
无法使用覆盖索引的情况
存储引擎不支持覆盖索引;
查询中使用了太多的列;
使用了双%号的like查询;
使用索引来优化查询
使用索引扫描来优化排序
通过排序操作
按照索引顺序扫描数据
使用索引扫描来优化排序
索引的列顺序和order by子句的顺序完全一致;
索引中所有列的方向(升序,降序)和order by 子句完全一致;
order by中的字段全部在关联表的第一张表中;
模拟Hash索引优化查询
只能处理键值的全值匹配查找;
所使用的Hash函数决定着索引键的大小;
利用索引优化锁
索引可以减少锁定的行数
索引可以加快处理速度,同时也加快了锁的释放
索引的维护和优化
删除重复和冗余的索引
查找未被使用过的索引
SELECT object_schema,object_name,index_name,b.`TABLE_ROWS` FROM performance_schema.table_io_waits_summary_by_index_usage a JOIN information_schema.tables b ON
a.`OBJECT_SCHEMA`=b.`TABLE_SCHEMA` AND
a.`OBJECT_NAME`=b.`TABLE_NAME`
WHERE index_name IS NOT NULL
AND count_star=0
ORDER BY object_schema,object_name;
更新索引统计信息及减少索引碎片
analyze table table_name
optimize table table_name(使用不当会导致锁表)