SQL 表结构及索引

  1. 新建数据表应注意,不要在表名和字段名中使用 SQL 保留字,虽然可以通过在名称两端加`字符的方式规避错误,但这可能会给未来的程序维护带来麻烦;
  2. 在需要更新(而非只添加)的数据表中存储字符串数据的字段,长度不超过200字节时,请务必使用char类型,超过200字节时,请务必使用text类型。使用varchar类型会导致表的行存储变成变长行,严重降低行数据的更新速度,但如果该数据表在业务上只实现SELECTINSERT操作,则不必介意;
  3. 任何时候,在查询的JOIN子句中出现用于拼接的列,必须针对该列创建索引。
  4. 在查询的WHERE子句中出现的条件,应针对该条件创建复合索引,示例如下:

    1. 查询语句类似
      SELECT * FROM T1 WHERE {C1 = a | C1 IN (...) | C1 | C1 BETWEEN a, b}时,应为 C1 列创建索引
    2. 查询语句类似
      SELECT * FROM T1 WHERE C1 = a AND C2 = b时,应为 C1 和 C2 列创建复合索引,即ADD KEY C1-C2-idx (C1, C2)
    3. 子查询的情况以此类推
  5. 请尽量避免对字符串类型字段进行通配符在前的LIKE比对,此类比对无法使用索引,请尽可能将此类功能以全文检索方式实现,如确需此类比对,请务必将其它的匹配条件置于此条件之前,示例如下:

    1. 以下写法是错误的
      SELECT * FROM T2 WHERE C1 LIKE '%abc%' AND C2 IN (...)
    2. 以下写法是正确的
      SELECT * FROM T2 WHERE C2 IN (...) AND C1 LIKE '%abc%'

实际上,如 5.1 所示的简单查询,数据库引擎会自动优化为 5.2的方式,但考虑到 JOIN 查询和嵌套子查询等引擎难以优化的情况,请务必养成此良好的书写风格。

来自公司近二十年工作经验服务器大神给予我们菜鸟的一些分享。

来源:中战博客,欢迎分享!
标签: mysql,SQL,索引,优化