MySQL 优化 MySQL 优化

  • 表关联查询时务必遵循 小表驱动大表 原则;
  • 使用查询语句 where 条件时,不允许出现 函数,否则索引会失效;
  • 使用单表查询时,相同字段尽量不要用 OR,因为可能导致索引失效,可以使用 UNION 替代;
  • LIKE 语句不允许使用 % 开头,否则索引会失效;
  • 组合索引一定要遵循 从左到右 原则,否则索引会失效;
  • 索引不宜过多,根据实际情况决定,尽量不要超过 10 个;
  • 每张表都必须有 主键,达到加快查询效率的目的;
  • 分表,可根据业务字段尾数中的个位或十位或百位(以此类推)做表名达到分表的目的;
  • 分库,可根据业务字段尾数中的个位或十位或百位(以此类推)做库名达到分库的目的;
  • 表分区,类似于硬盘分区,可以将某个时间段的数据放在分区里,加快查询速度,可以配合 分表 + 表分区 结合使用;

#神器 EXPLAIN 语句

EXPLAIN 显示了 MySQL 如何使用索引来处理 SELECT 语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。

使用方法,在 SELECT 语句前加上 EXPLAIN 即可,如:

EXPLAIN SELECT * FROM tb_item WHERE cid IN (SELECT id FROM tb_item_cat)

 

    • id: SELECT 识别符。这是 SELECT 的查询序列号
    • select_type: SELECT类型,可以为以下任何一种
    • table: 输出的行所引用的表
    • partitions: 表分区
    • type: 联接类型。下面给出各种联接类型,按照 从最佳类型到最坏类型 进行排序
    • system: 表仅有一行(=系统表)。这是 const 联接类型的一个特例。

possible_keys:

       指出 MySQL 能使用哪个索引在该表中找到行
    • key: 显示 MySQL 实际决定使用的键(索引)。如果没有选择索引, 键是 NULL。
    • key_len: 显示 MySQL 决定使用的键长度。如果键是 NULL, 则长度为 NULL。
    • ref: 显示使用哪个列或常数与 key 一起从表中选择行。
    • rows: 显示 MySQL 认为它执行查询时必须检查的行数。多行之间的数据相乘可以估算要处理的行数。
    • filtered: 显示了通过条件过滤出的行数的百分比估计值。
    • Extra: 该列包含 MySQL 解决查询的详细信息