关于MYSQL的知识若干

What is InnoDB

主要特点:

  1. 必须要有主键,有了主键之后检索速度会得到很大提升
  2. 支持外键(MyISAM就不支持)
  3. 5.5.5之后成为MySQL的默认引擎
  4. 锁行。(MyISAM锁表)
  5. 支持事务。(MyISAM不支持)默认来说每条sql语句都会被 自动包装 成一条事务。所以多条SQL语句最好放在begincommit之间,一起提交。

Reference:

  1. 为什么你要用 InnoDB, 而不是 MyISAM ?

Optimizing SELECT statements

Where语句优化

下面这些查询都是很快的。

1
2
3
4
5
6
7
8
9
10
11
12
SELECT COUNT(*) FROM tbl_name;

SELECT MIN(key_part1),MAX(key_part1) FROM tbl_name;

SELECT MAX(key_part2) FROM tbl_name
WHERE key_part1=constant;

SELECT ... FROM tbl_name
ORDER BY key_part1,key_part2,... LIMIT 10;

SELECT ... FROM tbl_name
ORDER BY key_part1 DESC, key_part2 DESC, ... LIMIT 10;

一些优化建议

  • 移除不必要的括号
1
2
((a AND b) AND c OR (((a AND b) AND (c AND d))))
-> (a AND b AND c) OR (a AND b AND c AND d)
  • 常数折叠
1
2
(a<b AND b=c) AND a=5
-> b>5 AND b=c AND a=5
  • 移除常数条件
1
2
(b>=5 AND b=5) OR (b=6 AND 5=5) OR (b=7 AND 5=6)
-> b=5 OR b=6
  • COUNT(*)如果没有用WHERE语句限制住内容,在MyISAM或者MEMORY引擎中,所有条目的个数是直接从表信息中读取的。
  • WHERE优先排除掉一些无用的数据。
  • 在没有使用GROUP BY的语句中,HAVING的条件会被合并到WHERE中。
  • MySQL会优先读常量表。何为常量表?

    • 空表或者只有一行的表;
    • 一个用主键或唯一主键查询的表
      比如
    1
    2
    3
    SELECT * FROM t WHERE primary_key=1;
    SELECT * FROM t1,t2
    WHERE t1.primary_key=1 AND t2.primary_key=t1.id;
  • 以下两种情况下会创建一个temp表:

    • 同时存在ORDER BYGROUP BY,且两者依据的column不同
    • ORDER BY或者GROUP BY包含了join查询中第一个表以外的column
  • 使用索引

范围限定

Buy Me A Coffee / 捐一杯咖啡的钱
分享这篇文章~
0%
//