百万级别数据查询,SQL查询优化
针对近期项⽬中遇到的⼤数据查询进⾏总结。
这篇⽂章花费了我⼤量的时间,通过⽹上查资料和⾃⼰的总结归纳,如有不当,请⼤家指正:
1.在⼤数据查询中要避免like模糊查询,在进⾏模糊查询时会进⾏多次全表遍历,影响查询效率,速度。⼀定要使⽤模糊查询,请使⽤前置模糊查询,即百分号后置
2.避免or条件查询,如⾮空⼀般我们会⽤到(<>'' or <> null),可以使⽤is not null
3.避免使⽤降序
4.避免在where⼦句中使⽤ !=和 <>操作符,会导致引擎放弃使⽤索引,进⾏全表遍历
5.在进⾏关联查询时,索引应该建⽴在关联条件上(on)
6.去重使⽤group by
7.字段属性设置为not null(当查询字段为null时会导致索引失效)
8.避免使⽤SQL内置函数
9.合理的创建索引(索引是使⽤空间换时间优化⽅式,当创建过多的索引时,在新增数据,修改数据时(同时修改了索引列),索引也会同步更新,影响效率)
10.查询优化
-- 使⽤count(*)的⽅式统计⾏数,不需要对表进⾏遍历
EXPLAIN SELECT SQL_NO_CACHE count(*) FROM `log`
EXPLAIN SELECT SQL_NO_CACHE count(1) FROM `log`
-- 当字段不存在null
EXPLAIN SELECT SQL_NO_CACHE count(id) FROM `log`
-- 查询⼀个字段如果字段为null 进⾏全表遍历
EXPLAIN SELECT SQL_NO_CACHE count(param) FROM `log`
-- ====================================================================
-- 查询列中有不存在索引栏位全表遍历
sql优化的几种方式
EXPLAIN SELECT SQL_NO_CACHE id,group FROM `log` LIMIT 0,10
-- 查询字段中,ttime为索引字段直接通过索引可以拿到所有列值
EXPLAIN SELECT SQL_NO_CACHE id,ttime FROM `log` LIMIT 0,10
-- 查询多个字段为普通索引查询类型为all 全表遍历(可尝试组合索引)
EXPLAIN SELECT SQL_NO_CACHE id,ttime,code FROM `log` LIMIT 500,10
-- 当数据表超过10w使⽤此⽅式,效率更⾼,当数据量⼩时,则直接查询
EXPLAIN SELECT SQL_NO_CACHE
a.de
FROM
`log` a
INNER JOIN
(SELECT id FROM `log` LIMIT 500,10 ) b
ON
a.id =
b.id
如果存在有误的地⽅,欢迎⼤家指正。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。