(1)创建索引
CREATE INDEX index_name ON tb_name (col_name) // 创建索引(提高查询效率)
(2)where语句优化
避免使用 or
SELECT id FROM tb_name WHERE num=15 or num=20 // 低效查询
SELECT id FROM tb_name WHERE num=15
UNION ALL // 高效查询
SELECT id FROM tb_name WHERE num=20
避免使用 in,not in
SELECT num FROM tb1_name WHERE num IN(SELECT num FROM tb2_name) // 低效查询
SELECT num FROM tb1_name WHERE
EXISTS // 高效查询
(SELECT 1 FROM tb2_name WHERE num=tb1_name.num)
避免使用 having
SELECT name,SUM(num) FROM tb_name
GROUP BY name HAVING SUM(num)<2000 // 低效查询
SELECT name,SUM(num) FROM tb_name
WHERE SUM(num)<2000 GROUP BY name // 高效查询
避免对索引字段进行计算
SELECT name FROM tb_name WHERE num/2=10 // 低效查询
SELECT name FROM tb_name WHERE num=20 // 高效查询
避免在索引字段上使用<>,!=
- 否则将引擎放弃使用索引而进行全表扫描。
- 使用索引操作符:<,<=,=,>=,BETWEEN,IN 。
避免在索引上使用 = null ,is null
SELECT name FROM tb_name WHERE num is null // 低效查询
// num设置默认值0
SELECT name FROM tb_name WHERE num=0 // 高效查询
(3)select语句优化
限制使用select * 这种方式。
否则将进行全表扫描。
避免查询里面使用 LIKE '%m' 。
SELECT num FROM tb_name WHERE name LIKE '张%'; // 使用索引
SELECT num FROM tb_name WHERE name LIKE '%张'; // 不使用索引
(4)UNION 和 UNION ALL 操作符
尽量使用union all 代替 union 。
SELECT id FROM tb_name WHERE num=15
UNION // 低效查询
SELECT id FROM tb_name WHERE num=20
SELECT id FROM tb_name WHERE num=15
UNION ALL // 高效查询
SELECT id FROM tb_name WHERE num=20