查询速度优化,主要分数据库设计层面优化、SQL 语句优化、索引优化、常见原
因与查看执行计划 explain 后具体优化,共四个小模块。
1. 数据库设计层面优化
良好的数据库设计,主要是表和字段设计合理。主要是在概念模型和逻
辑模型阶段,将抽象和字段细化经过详细推敲。满足第三范式要求为前
提,将概念抽象准确,字段类型设计合理,以下 5 个小 tips:
1 能数值类型的不要字符串
2 能日期类型的不要字符串
3 能固定长度不要用变长
4 在不同表之间的字段,可以有必要的冗余。如用户 id 和用户名
5 已知的常见查询,提前建好索引。如学号、工号类
2. SQL 语句优化
其核心是避免全表扫描、合理运用查询条件
避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引
而进行全表扫描
首先应考虑在 where 及 order by 涉及的列上建立索引
避免在 where 子句中对字段进行 null 值判断,会必然导致全表扫描。
添加默认值是必要的。
避免 or 查询,必将全表扫描(********)
模糊查询避免前置模糊查询,即把”%”放到前面。如”select *
from student where name like %三%”
避免使用 in 和 not in。必要情况下可以用 between…and 代替,或
者用 exists 代替。
在条件中加入表达式或者函数操作,如”select * from student
where stdno%2==0“,亦将全表扫描。
select 指定列,而不是都是*
尽量使用数值作为 where 或是 order by 等的条件,其效率比字符串
类型高一个数量级。
3. 索引优化
索引对查询并不是都有效。当索引列存在大量重复值时候,索引将不
再有效。如 country 列,往往就只有”中国“一个值。
索引越多越好,对查询往往是对的,但对于 update 或是 insert 效率
会降低,尤其是高频的 update 或是 insert 操作。
在 order by 条件的列上添加索引,因为索引本身是排序的,可以提
高排序效率。
联合索引查询时,查询条件中出现联合索引第一列,或者全部,则能利
用联合索引。如果只出现第 2、第 3 列则联合索引无效。
4. 常见原因与查看执行计划 explain 后具体优化
没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计
的缺陷)
I/O 吞吐量小,形成了瓶颈效应。
内存不足
网络速度慢
查询出的数据量过大(可以采用多次查询,其他的方法降低数据量)
返回了不必要的行和列
查询语句不好,没有优化
explain 查看执行计划使用