- 大部分业务基于时间节点筛选足够,即索引长度14位;
- 如果是并发业务,很多时间节点相同,则索引长度是时间点+标识位;
4、其他索引例如全文索引等,这些用到的场景不多,如果数据庞大,又需要检索等,通常会选择强大的搜索中间件来处理 。显式唯一索引,这种也会在程序上做规避,避免不友好的异常被抛出 。
三、索引查询如何创建最优的索引,是一件不容易的事情,同样在查询的时候,是否使用索引也是一件难度极大的事情,经验之谈:多数是性能问题暴露的时候,才会回头审视查询的SQL语句,针对性能问题,做相应的查询优化 。
1、单列查询这里直接查询主键索引,MySQL的主键一般选择自增,所以速度非常快 。
EXPLAIN SELECT * FROM ds_order WHERE id=2;EXPLAIN SELECT * FROM ds_order WHERE id=1+1;EXPLAIN SELECT * FROM ds_order WHERE id+1=1;
这里,id=2,id=1+1,MySQL都可以自动解析,但是id+1是在索引列上执行运算,直接导致主键索引失效 。这里有一个基本策略,如果非要在单列索引上做操作,可以将该逻辑放在程序中,到MySQL层面,SQL语句越干净利落越好 。2、前缀索引查询前缀索引的查询,可以基于Like对特定长度筛选,或者全订单号查询 。
EXPLAIN SELECT * FROM ds_order WHERE order_no LIKE '202008011314158723628732871625%';EXPLAIN SELECT * FROM ds_order WHERE order_no='20200801131415872362873287162572367';
3、组合索引查询查询最麻烦的就是组合索引,或者说查询条件组合起来,都使用了索引:EXPLAIN SELECT * FROM ds_order WHERE create_time>'2020-08-01 00:00:00' AND order_state='1';
上述基于组合索引中列的顺序,使用了组合索引:state_create_time_index 。EXPLAIN SELECT * FROM ds_order WHERE create_time>'2020-08-01 00:00:00';
上述只使用create_time列,也同样使用了索引结构 。EXPLAIN SELECT * FROM ds_order WHERE order_state='1';
上述如果只使用order_state条件,则结果显示全表扫描 。EXPLAIN SELECT * FROM ds_order WHERE create_time>'2020-08-01 00:00:00' AND order_no LIKE '20200801%';
上述则基于组合索引的create_time列和单列索引order_no保证查询条件都使用了索引 。通过上面几个查询案例,索引组合索引使用的注意事项如下:
- 组合索引必须按索引最左列开始查询;
- 不能跳过组合字段查询,这样无法使用索引;
- 基于注解或唯一索引保证数据库表中数据的唯一性;
- 索引通过减少扫描表的行数提高查询的效率;
- 创建索引和维护索引,会耗费空间和实际;
- 查询以外的操作增删改等,都需要动态维护索引;
【MySQL进阶篇 | 合理的使用索引结构和查询】
推荐阅读
- 范振钰|钓鱼大师的饵料值得信服吗?进阶换饵鱼不认,为何蓝鲫有靠谱标签
- MySQL主从延时这么长,要怎么优化?
- MySQL innodb引擎深入讲解
- 看完这篇介绍,茶树菇烧肉的做法
- 如何将DB2数据库转换成Oracle数据库,这一篇告诉你
- 阿里云RDS迁移,极简安装 MySQL TokuDB 引擎
- 掌握Linux文件权限,看这篇就够了
- 我C,MySQL双主架构,原来能这么玩
- 月球的光芒 月球闪光之谜这篇文章
- 6个MySQL GUI工具,数据库管理必备