- 大部分业务基于时间节点筛选足够,即索引长度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进阶篇 | 合理的使用索引结构和查询
- 为什么火山喷发时常伴随着闪电现象呢? 火山爆发的时候为什么会有闪电
- 目前,全球已经投入使用的主要卫星导航系统包括 欧盟建立的卫星导航定位系统是
- 网卡的电口与光口的差别
- 红茶又叫什么茶,茶的规格
- CentOS7下利用Google Authenticator实现SSH登录的二次身份验证
- 金银花茶的功能主治,菊花决明子金银花茶的功效与作用
- Linux Shell中单引号、双引号、反引号的解释