「这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战」
子查询优化
MySQL 从 4.1 版本开始支持子查询,使用子查询进行 select嵌套查询,可以一次完成很多逻辑上需要多个步骤的 SQL 操作。但是子查询虽然很灵活,其执行效率并不高。因为执行子查询时,会创建临时表,查询SQL执行完毕后再删除这些临时表。所以,子查询的速度会受到一定的影响。我们可以使用连接查询来代替子查询,因为连接查询不会建立临时表,其速度比子查询快,然后我们可以通过where条件过滤掉多余数据。
索引与其优化
索引的本质也是一种数据结构,我们可以将其理解为数据表的“目录”,在MySQL中索引是通过B+树实现的,建立索引后会显著提升查询效率。当然并不是所有的索引都会生效,同时索引也不是百利而无一害。下面我们就详细介绍下:
1、索引的分类
普通索引 - index :加速数据查询效率;
主键索引 - primary key :加速查找+约束(不为空且唯一);
唯一索引 - unique:加速查找+约束 (唯一);
联合索引:
-
primary key:联合主键索引
-
unique:联合唯一索引
-
index:联合普通索引
全文索引 fulltext :用于搜索很长一篇文章的时候,效果最好。
2、索引的优点
-
保证数据唯一性:可以通过建立唯一索引或者主键索引,保证数据库表中每一行数据的唯一;
-
提高数据检索效率:建立索引可以减少表的检索行数,大大提高检索的数据效率;
-
在表连接的连接条件上建立索引,可以加速表与表直接的相连;
-
在分组和排序字句进行数据检索,可以减少查询时间中分组和排序时消耗的时间(PS:数据库的记录会重新排序);
3、索引的缺点
- 在创建索引和维护索引会耗费大量时间,且随着数据量的增加而增加;
- 索引文件会占用物理空间,除了数据表需要占用物理空间之外,每一个索引还会占用一定的物理空间;
- 当对表的数据进行增删改操作的时候,索引也要进行动态的维护,就会降低数据的维护速度(PS:注意 -> 如果在一个大表上创建了多种组合索引,索引文件的会膨胀很快);
4、适合加索引的情况
- 在经常需要作为查询条件的列上加索引,可以加快查询的速度;
- 主键上:可以确保列的唯一性;
- 在表与表的连接条件上加索引,可以加快连接查询的速度;
- 在经常需要排序、分组和去重的字段上加索引,可以加快排序查询的时间;
5、不适合加索引的情况
- 查询中很少使用到的字段不应该创建索引,如果建立了反而会降低 mysql 的性能,同时页增大了空间需求(因为维护索引也会消耗数据库性能);
- 数据差异性很少的的字段也不适合建立索引,比如性别字段,只有男或者女
- 数据类型为 text 或者 image、bit 的字段不应加索引;
- 当表的增删改操作远远大于查询操作时不应创建索引,因为这两个操作是互斥的;
6、索引失效的情况
- 查询条件中有 or,即使加了索引也不会生效;
- 加索引字段,其值不能有 null 值,有 null 值会使该列索引失效;
- 对于联合索引,要遵循最左原则,保证查询条件中字段的顺序与索引中的顺序一致;
- 模糊查询以%开头的,索引不生效;
- 在索引的列上使用表达式或者函数,索引会失效 e.g. select * from com_user where YEAR(add_date) < 2021,这样在每一行上都会进行运算,进而全表扫描导致索引失效,可以改成:select * from com_user where add_date < ’2021-01-01′;