一个多条件查询sql,表数据量 280万,46个字段。
 这是sql:
SELECT 
  c.* 
FROM
  b_car c 
WHERE c.enterpriseCode = '20180403001' 
  AND c.assign = 0 
  AND c.lastCityId IN ('320000') 
  AND c.lastCompanyCode IN ('PICC') 
  AND c.lastEndDate >= '2018-05-17' 
  AND c.lastEndDate <= '2018-05-31' 
ORDER BY c.createDate ASC 
LIMIT 0, 1 我在enterpriseCode ,assign  这两列建立了组合索引名 b_car_enterpriseAssign。表原本还有其他索引 createDate 索引名 b_car_createDate。默认 走的是 b_car_createDate。查询耗时 14秒。 explain 结果如下:
强制使用索引 b_car_enterpriseAssign。
select c.* from b_car c 
 force index(b_car_enterpriseAssign)
WHERE c.enterpriseCode = '20180403001' 
  AND c.assign = 0 
  AND c.lastCityId IN ('320000') 
  AND c.lastCompanyCode IN ('PICC') 
  AND c.lastEndDate >= '2018-05-17' 
  AND c.lastEndDate <= '2018-05-31' 
ORDER BY c.createDate ASC 
LIMIT 0, 1 
查询耗时 0.268秒。 explain 结果如下:
没办法,现阶段只能在程序里面,sql 强制指定索引b_car_enterpriseAssign,想咨询下专业的数据库大牛,为什么没有走新建的索引,而且怎么样优化下 比较好,sql里面 强制指定 索引 这个不好。

解决方案 »

  1.   

    你的b_car表的lastEndDate字段,在数据库中存储的应该是Timestamp类型的吧,比较大小的时候,从页面传过来的值用TO_DATE统一转换为data类型,进行比较
    这样查询会快一点
      

  2.   

    把order by   c.createDate 字段加入复合索引
      

  3.   

    看不到您的数据分布情况,但是可以试试如下的操作:
    1、将所有的IN,换成=。
    2、c.lastEndDate >= '2018-05-17'   AND c.lastEndDate <= '2018-05-31' 换成c.lastEndDate BETWEEN '2018-05-17' AND '2018-05-31' 
    3、看看你用到的所有,讲差异最大的字段,放在索引的前边。
      

  4.   

    来看下我的优化的文章吧!哈哈哈,今天刚写的 
    https://blog.csdn.net/gyp0307/article/details/80345807
      

  5.   

    b_car_createDate索引有哪些字段啊