数据库索引相关知识

关于索引

什么是索引

索引与书的目录类似,可以快速定位要查找的数据所有位置,索引使数据库程序无需扫描整个表,就可以在其中找到所需要的数据,索引包含了一个表中包含值的列 表,其中包含了各个值的行所存储的位置,索引可以是单个或一组列,索引提供的表中数据的逻辑位置,合理划分索引能够大大提高数据库性能。 索引需要注意:加索引的列一定要是经常使用来条件筛选的列,并且where中要避免对有索引的列进行计算,索引并不是越多越好,索引会占用更多的存储空间,也会对insert 、update、delete这些操作有一定的性能影响。

索引的优点

  • 大大的缩短查询事件,加索引至少比普通查询快100倍
  • 减少磁盘IO(像字典一样可以直接定位)
  • 在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
  • 可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
  • 通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
  • 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。

索引的缺点

  • 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加
  • 索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大
  • 当对表中的数据进行增加,删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度

创建索引的规则

  • 在经常需要搜索的列上创建索引,可以加快搜索的速度;
  • 在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;
  • 在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;
  • 在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的
  • 在经常需要排序的列上创建索引,因为索引已经排序,这样可以利用索引的排序加快排序的查询时间,减少一次文件排序。
  • 在经常使用where中的列上创建索引,加快条件的判断速度。

不适合创建索引的情况

  • 很少使用得列不应该创建
  • 对于很少数据值的列也不应该增加索引,因为这些列的取值很少,列入人事表的性别列在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大,增加索引并不能明显加快搜索速度。
  • 对于那些定义为text,image,bit数据类型的列不应该增加索引。这是因为这些列的数据量要么相当大,要么取值很少
  • 当修改性能远远大于检索性能时不应该创建索引。因为,修改性能和检索性能时相互矛盾的。

索引失效的情况

  • 如果条件中有or,即使其中有条件带索引也不会使用(想要使用or,又想让or索引生效,只能将or条件中的每个列都加上索引)
  • 多列索引,不是使用的第一部分,则不会使用索引
  • 类型转换时索引不生效(如果列类型是字符换,那一定要在条件中将数据使用引号引用起来,否则不适用索引)
  • where中索引列有运算
  • where中索引列使用了函数
  • 如果mysql觉得全表扫描更快时(数据少),索引不生效。
  • like 模糊查询中,右模糊查询(321%)会使用索引,而%321 和%321%会放弃索引而使用全局扫描
  • 查询的数量是大表的大部分,应该是30%以上
  • not in,not exist不使用索引
  • 存储引擎不能使用索引中范围条件右边的列。——范围之后的索引失效。(< ,> between and,)
    在这里插入图片描述
    执行查询一时,索引全部使用到。
    执行查询二时,索引使用到name和age,但是name是使用索引检索,而age着重索引排序,这时age为范围查找,pos索引将失效

如何创建索引

  • 创建索引语句
CREATE INDEX index_name ON table(column)
  • 修改表时加索引语句
ALTER TABLE table_name ADD INDEX index_name ON (column)
  • 唯一索引
CREATE UNIQUE INDEX indexName ON table(column)
  • 修改表时加唯一索引语句
ALTER TABLE table_name ADD UNIQUE indexName ON (column)
  • 主键索引
CREATE TABLE 'table' (
    'id' int(11) NOT NULL AUTO_INCREMENT ,   
    PRIMARY KEY ('id')
);
  • 复合索引(组合索引)
ALTER TABLE `table` ADD INDEX indexName (name,xb,age); 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

示圆阇梨偈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值