一个多条件查询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里面 强制指定 索引 这个不好。
这是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里面 强制指定 索引 这个不好。
解决方案 »
- mysql表合并问题
- 安装HandlerSocket,with-mysql-source报错,如何解决?
- 怎么样让带有auto_increment属性的id列中一些记录被删除之后,后面的id自动把前面的填充满呢?
- 二個表關聯查詢問題。
- MYSQL的中文模糊查询问题...
- delphi 通过ODBC访问mysql,如何备份和还原数据库
- 插入、修改数据时,数据库是必须写入磁盘才返回成功,还是延迟写入直接成功。
- 我的LINUX在装MYSQL时.gz格式的!在MAKE时,提示找不到linux/autoconf.h文件,无法编译昨办?
- 通过视图 查询 真的影响效率吗?
- mysql5.6或者5.5 chm文档 哪里有下载
- sql语句优化问题,求助
- mysql中的存储过程能返回数组么?
这样查询会快一点
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、看看你用到的所有,讲差异最大的字段,放在索引的前边。
https://blog.csdn.net/gyp0307/article/details/80345807