数据库优化
SQL
查询优化
避免全表扫描,应该考虑在
where
及order by
涉及的列上建立索引;查询时使用
select
明确指明所要查询的字段,避免使用select *
(keys *
,flushdb
等)的操作;SQL
语句尽量大写,如:SELECT name FROM t WHERE id=1;
- 对于小写的
SQL
语句,通常数据在解析SQL
语句时,通常会先转化成大写再执行。
尽量避免在
where
子句中使用!=
或<>
操作符,MySQL
只有对以下操作符才使用索引:<
,<=
,=
,>
,>=
,BETWEEN
,IN
,以及某些时候的LIKE
;SELECT id FROM t WHERE name LIKE 'abc%';
对于模糊查询,
SELECT id FROM t WHERE name LIKE '%abc%'; // 或者 SELECT id FROM t WHERE name LIKE '%abc'
将导致全表扫描,应避免使用,若要提高效率,可以考虑全文检索;
遵循最左原则,在
where
子句中写查询条件时把索引字段放在前面,如:// mobile为索引字段,name为非索引字段 // 推荐 SELECT ... FROM t WHERE mobile='1391111111' AND name='gyhs'; // 不推荐 SELECT ... FROM t WHERE name='gyhs' AND mobile='13911111111';
// 建立了复合索引key(a, b, c) // 推荐 SELECT ... FROM t WHERE a=... AND b=... AND c=... SELECT ... FROM t WHERE a=... AND b=... SELECT ... FROM t WHERE a=... // 不推荐 SELECT ... FROM t WHERE b=... AND c=... SELECT ... FROM t WHERE b=... AND a=... AND c=... ...
能使用关联查询解决的尽量不要使用子查询,如:
// 子查询 SELECT article_id, title FROM t_article WHERE user_id IN (SELECT user_id FROM t_user WHERE user_name IN('yangmi','tanyan','dilireba')) // 关联查询(推荐) SELECT b.article_id, b.title FROM t_user AS a INNER JOIN t_article AS b ON a.user_id=b.user_id WHERE a.user_name IN ('yangmi', 'tangyan', 'dilierba')
能不使用关联查询的尽量不要使用关联查询;
- 不需要获取全表数据的时候,不要查询全表数据,使用
LIMIT
来限制数据。