首页 理论教育 数据库高级应用技术:认识索引及其优化策略

数据库高级应用技术:认识索引及其优化策略

时间:2023-11-03 理论教育 版权反馈
【摘要】:2)缺点创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。4)排序的索引问题MySQL查询只使用一个索引,因此如果where子句中已经使用了索引,那么order by中的列是不会使用索引的。索引应该建在选择性高的字段上。删除无用的索引,避免对执行计划造成负面影响。

数据库高级应用技术:认识索引及其优化策略

1.索引优缺点

1)优点

(1)通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。

(2)可以大大加快数据的检索速度,这也是创建索引的最主要的原因。

(3)可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。

(4)在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。

(5)通过使用索引,可以在查询的过程中使用优化隐藏器提高系统的性能。

2)缺点

(1)创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。

(2)索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。

(3)当对表中的数据进行增加、删除和修改的时候,这些数据表上会重建相关索引,这样就降低了数据写操作的速度。

2.索引常见问题

设计好数据库的索引可以大大地提高数据库效率,但设计索引的时候也应注意以下几个问题:

1)过度索引问题

对于查询占主要的应用来说,索引显得尤为重要。很多时候性能低下的问题就是由忘记添加索引造成的,或者是由没有添加更为有效的索引导致的。如果不加索引的话,那么查找任何哪怕只是一条特定的数据都会进行一次全表扫描,若一个表的数据量很大而符合条件的结果又很少,那么不加索就引会引起致命的性能下降。但是也不是什么情况都非得建索引不可,比如性别可能就只有两个值,建索引不仅没什么优势,还会影响到更新速度,这被称为过度索引。

2)复合索引问题

SQL语句:select * from users where area='beijing' and age=22,如果在area和age上分别创建单个索引,由于MySQL查询每次只能使用一个索引,虽然这样已经相对不做索引时全表扫描提高了效率,但是如果在area、age两列上创建复合索引将带来更高的效率。如果创建(area, age, salary)的复合索引,其实相当于创建(area, age, salary)、(area, age)、(area)三个索引,这被称为最佳左前缀特性。因此在创建复合索引时应该将最常用作限制条件的列放在最左边,依次递减。(www.xing528.com)

3)含有NULL值的列上索引失效问题

只要列中包含NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以在数据库设计时不要让字段的默认值为NULL。

4)排序的索引问题

MySQL查询只使用一个索引,因此如果where子句中已经使用了索引,那么order by中的列是不会使用索引的。因此数据库默认排序可以在符合要求的情况下不使用排序操作,尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。

3.索引设计原则

索引的建立必须慎重,对每个索引的必要性都应该经过仔细分析,要有建立的依据。在数据表上建立索引有如下七大原则:

(1)表的主键、外键必须有索引。

(2)经常与其他表进行连接的表,在连接字段上应该建立索引。

(3)经常出现在where子句中的字段,特别是大表的字段,应该建立索引。

(4)索引应该建在选择性高的字段上。

(5)索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建立索引。

(6)频繁地进行写操作的数据表,不要建立太多的索引。

(7)删除无用的索引,避免对执行计划造成负面影响。

以上是建立索引时的一般判断依据,太多的索引与不充分、不正确的索引对性能都毫无益处。在表上建立的每个索引都会增加存储开销,索引对于插入、删除、更新操作也会增加处理上的开销。另外,过多的复合索引,在有单字段索引的情况下,一般都是没有存在价值的;相反,还会降低数据增加删除时的性能,特别是对频繁更新的表来说,负面影响更大。

总的来说,小型表不需要建立索引;超大型表,如表记录数量在亿条数据级以上,还是建议使用非关系型数据库;一些特殊字段的数据库,如BLOB、CLOB类型字段也不适合建立索引。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈