SQL如何优化和设计索引

SQL优化

  • 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引;
  • 避免使用 NULL 字段,很难查询优化且占用额外索引空间,可以设置默认值0或'';
  • 应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描;
  • 应尽量避免在 where 子句中使用 or 来连接条件,可以使用union all查询,否则同上;
  • in 和 not in 也要慎用,对于连续的数值,能用 between 就不要用 in 了,很多时候用 exists 代替 in 是一个好的选择:where exists(select 1 from b where num=a.num)
  • 并不是所有索引对查询都有效,SQL是根据表中数据来进行查询优化的,当索引列有大量数据重复时,SQL查询可能不会去利用索引
  • 索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,一个表的索引数最好不要超过6个
  • 尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。
  • 尽可能的使用 varchar 代替 char ,因为首先变长字段存储空间小,可以节省存储空间
  • 任何地方都不要使用 select * from t ,用具体的字段列表代替*
  • 避免频繁创建和删除临时表,以减少系统表资源的消耗,如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除

设计数据库中索引

说白了,数据库的索引问题就是查找问题
数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询,更新数据库中表的数据.索引的实现通常使用B树和变种的B+树(mysql常用的索引就是B+树)
除了数据之外,数据库系统还维护为满足特定查找算法的数据结构,这些数据结构以某种方式引用数据.这种数据结构就是索引。
创建索引的好处:
1、通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
2、可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
3、可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
4、在使用分组和排序 子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
5、通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
创建索引的坏处:
1、创建索引和维护索引要耗费时间,而且时间随着数据量的增加而增大
2、索引需要占用物理空间,如果要建立聚簇索引,所需要的空间会更大
3、在对表中的数据进行增加删除和修改时需要耗费较多的时间,因为索引也要动态地维护
索引是建立在数据库表中的某些列的上面。因此,在创建索引的时候,应该仔细考虑在哪些列上可以创建索引,在哪些列上不能创建索引。
一般来说,应该在这些列上创建索引,例如:
1、在经常需要搜索的列上,可以加快搜索的速度。
2、在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构。
3、在经常用在连接(join)的列上,这些列主要是一些外键,可以加快连接的速度。
4、在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的。
5、在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间。
6、在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。
不应该在哪些列上创建索引
1、查询中很少用到的列
2、字段不在where语句出现的列
3、字段数据需要频繁修改的列,因为当增加索引时,会提高搜索性能,但是会降低修改性能
4、对于那些具有很少数据值的列.比如人事表的性别列,bit数据类型的列
5、对于那些定义为text,image的列.因为这些列的数据量相当大

索引失效的几种常用场景

  • 不满足最左前缀匹配原则
  • 查询条件与索引列存在隐式转换
  • 模糊查询使用左模糊或全模糊:like '%xx'
  • 对索引列进行计算或使用函数
  • 存在or关键字且查询条件中有非索引字段
posted @ 2022-05-11 17:02  zhαojh  阅读(262)  评论(0编辑  收藏  举报