mysql-2000多万性能与force index强制指定索引

【条件】:

      1)表名 tb_process

      2)索引有 index_mobile,index_create_date  ,无组合索引

      3)数据量 2898万

      4) select  count(*)  from tb_process  where    create_date>= '2017-11-17 00:00:00' and create_date<= '2017-12-10 00:00:00'  and is_deleted =0 and mobile  in ( ?,?,?)

【问题】:

       使用create_date, mobile 同时作为查询条件时(jdbc连接池),查询速度非常慢(70s),在某个时间点偶尔一次会非常块(2s),同时会存在如下情况:

     1) explain 解释器显示走到了两个索引分别为: index_mobile,index_create_date 

     2) 实际查询效率,远不如走到单个索引效率  index_mobile索引 5s, index_create_date 3s

 

【原因】:

     explain 解释器从语法上会走到2个索引,但实际上当实际执行查询的时,即使有多个单列索引,MySQL只能使用一个索引,当有2个单列的索引,MySQL会试图选择一个限制最严格的索引,大量数据时也有可能会索引失效 ;

【排查方法】:调整查询条件,对比走单列索引耗时情况,以确定索引是否生效。

【解决方案】:强制使用性能最高的索引 或 建立多列的组合索引

条件索引耗时单位(秒)
create_date, mobile 强制索引index_create_date 2s
create_date, mobile 强制索引
index_mobile
22s
create_date, mobile 默认索引30s
mobile,create_date 默认索引36s
   

             以上为Navicat Premium客户端与jdbc连接池查询结果


【强制索引语法】:

   select * from table_name [ force index( idx_name ) ]  where condition


其他:

        USE INDEX ——MySQ 去参考的索引列表,就可以让 MySQL 不再考虑其他可用的索引。
       IGNORE INDEX——MySQL 忽略一个或者多个索引。
       FORCE INDEX—— 强制 MySQL 使用一个特定的索引。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cheneron

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值