What is InnoDB
主要特点:
- 必须要有主键,有了主键之后检索速度会得到很大提升
- 支持外键(MyISAM就不支持)
- 5.5.5之后成为MySQL的默认引擎
- 锁行。(MyISAM锁表)
- 支持事务。(MyISAM不支持)默认来说每条sql语句都会被 自动包装 成一条事务。所以多条SQL语句最好放在
begin
和commit
之间,一起提交。
Reference:
Optimizing SELECT statements
Where语句优化
下面这些查询都是很快的。
1 | SELECT COUNT(*) FROM tbl_name; |
一些优化建议
- 移除不必要的括号
1 | ((a AND b) AND c OR (((a AND b) AND (c AND d)))) |
- 常数折叠
1 | (a<b AND b=c) AND a=5 |
- 移除常数条件
1 | (b>=5 AND b=5) OR (b=6 AND 5=5) OR (b=7 AND 5=6) |
COUNT(*)
如果没有用WHERE
语句限制住内容,在MyISAM或者MEMORY引擎中,所有条目的个数是直接从表信息中读取的。- 用
WHERE
优先排除掉一些无用的数据。 - 在没有使用
GROUP BY
的语句中,HAVING
的条件会被合并到WHERE
中。 MySQL会优先读常量表。何为常量表?
- 空表或者只有一行的表;
- 一个用主键或唯一主键查询的表
比如
1
2
3SELECT * FROM t WHERE primary_key=1;
SELECT * FROM t1,t2
WHERE t1.primary_key=1 AND t2.primary_key=t1.id;以下两种情况下会创建一个temp表:
- 同时存在
ORDER BY
和GROUP BY
,且两者依据的column不同 ORDER BY
或者GROUP BY
包含了join查询中第一个表以外的column
- 同时存在
- 使用索引