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