SQL优化及多数据库支持分享(六)

「这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战

子查询优化

​ MySQL 从 4.1 版本开始支持子查询,使用子查询进行 select嵌套查询,可以一次完成很多逻辑上需要多个步骤的 SQL 操作。但是子查询虽然很灵活,其执行效率并不高。因为执行子查询时,会创建临时表,查询SQL执行完毕后再删除这些临时表。所以,子查询的速度会受到一定的影响。我们可以使用连接查询来代替子查询,因为连接查询不会建立临时表,其速度比子查询快,然后我们可以通过where条件过滤掉多余数据。

索引与其优化

​ 索引的本质也是一种数据结构,我们可以将其理解为数据表的“目录”,在MySQL中索引是通过B+树实现的,建立索引后会显著提升查询效率。当然并不是所有的索引都会生效,同时索引也不是百利而无一害。下面我们就详细介绍下:

1、索引的分类

​ 普通索引 - index :加速数据查询效率;

​ 主键索引 - primary key :加速查找+约束(不为空且唯一);

​ 唯一索引 - unique:加速查找+约束 (唯一);

​ 联合索引:

  • primary key:联合主键索引

  • unique:联合唯一索引

  • index:联合普通索引

    全文索引 fulltext :用于搜索很长一篇文章的时候,效果最好。

    扫描二维码关注公众号,回复: 13171675 查看本文章

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′;

猜你喜欢

转载自juejin.im/post/7031149290072309767