linux MySQL数据库索引
索引在数据库中占有重要地位,当高并发时,一条一条的查找数据是很慢的,但是索引可以分流,可以快速定位,解决高并发。
目录
一、索引概念
二、索引作用
三、索引的应用
四、索引分类
五、索引的创建
六、索引的管理
七、总结
一、索引概念
1.索引概念
数据库索引是一种排序的数据结构,它包含了索引值和对应数据行的物理地址。使用索引可以避免全表扫描,快速定位到需要的数据行,从而提高数据库查询速度。可以将索引类比为书的目录,通过目录中的页码可以快速找到所需的内容。索引可以基于一个或多个表列的值排序,并且它的主要目的是加快对表中记录的查找或排序。建立索引可以大幅提高数据库查询和排序性能。
2.索引背景
数据库索引的发展可以追溯到关系型数据库的出现。早期的数据库系统仅支持全表扫描,这意味着查询速度会随着数据量的增加而变慢。为了解决这个问题,数据库开发人员开始探索新的数据结构,例如B树和B+树。这些数据结构可以在不进行全表扫描的情况下快速定位到需要的数据行,从而提高查询速度。
二、索引作用
1.索引作用
创建合适的索引可以大大加快数据库查询速度,这是创建索引的主要原因。当表很大或查询涉及到多个表时,使用索引可以提高查询速度成千上万倍。通过使用索引,可以降低数据库的IO和排序成本。通过创建唯一性索引,可以保证数据表中每一行数据的唯一性。使用索引可以加快表与表之间的连接,以及在使用分组和排序时,可以大大减少分组和排序的时间。因此,合理使用索引是提高数据库性能的关键。
2.索引的弊端
有以下几个方面需要注意:
-
索引需要占用额外的磁盘空间,特别是对于大型数据库而言,索引文件可能会占用相当大的磁盘空间。在 MyISAM 引擎中,数据文件和索引文件是分离的,而 InnoDB 引擎中的表数据文件本身就是索引文件,因此索引对磁盘空间的占用情况因引擎而异。
-
在插入和修改数据时,索引也需要随之变动,这可能会导致一些性能问题。当新的数据被插入时,需要更新索引以反映新的数据位置。当数据被修改时,索引也需要被更新以反映新的数据值。这些操作都需要花费额外的时间,因此在进行大量数据插入或修改操作时,需要谨慎考虑索引的使用。
-
在某些情况下,索引可能会降低查询性能。例如,如果索引不是基于经常查询的列,或者索引的选择性非常低,那么索引可能会导致查询变慢。因此,在创建索引时需要权衡索引的选择性和查询的频率,以确保索引能够提高查询性能。
-
综上所述,索引虽然可以提高数据库的查询性能,但也需要考虑到一些潜在的性能问题和空间开销。在实际使用中,需要根据具体情况权衡使用索引的利弊。
三、索引的应用
1.索引的创建原则
索引并不是在所有情况下都适合使用。虽然索引可以提高数据库查询的速度,但是不恰当地使用索引会带来一些负面影响,例如增加系统资源的消耗和查询性能的下降等。因此,在创建索引时需要谨慎考虑以下几个因素:
-
表的主键和外键必须有索引,因为主键具有唯一性,外键关联的是子表的主键,查询时可以快速定位。
-
记录数超过300行的表应该有索引,如果没有索引,需要遍历整个表,这会严重影响数据库的性能。
-
经常与其他表进行连接的表,在连接字段上应该建立索引。
-
唯一性太差的字段不适合建立索引。
-
更新太频繁的字段不适合创建索引,因为频繁的更新会导致索引不断变化,影响数据库性能。
-
经常出现在 where 子句中的字段,特别是大表的字段,应该建立索引。
-
索引应该建在选择性高的字段上,这样可以减少索引的重复性,提高查询性能。
-
索引应该建在小字段上,对于大的文本字段或超长字段,不要建立索引,因为这会导致索引占用过多的磁盘空间,影响数据库性能。
-
总之,在创建索引时需要考虑到各种因素,权衡索引的利弊,以确保索引能够提高数据库的查询性能,而不是影响数据库的性能。
2.索引应用场景
索引是数据库优化的重要手段之一,可以大幅提高查询性能。以下是一些适合使用索引的场景:
-
经常使用的查询条件:如果一个查询条件经常被使用,例如用户ID或日期范围,那么在该列上创建索引可以大大提高查询性能。
-
外键关联:外键关联是数据库中经常出现的情况。在外键字段上创建索引可以加快关联查询的速度。
-
多表连接:如果一个查询涉及到多个表,那么在连接字段上创建索引可以加快查询速度。
-
分组和排序:如果一个查询需要分组或排序,那么在分组或排序字段上创建索引可以大大提高查询性能。
-
大数据量的表:如果一个表中包含大量的记录,那么在查询时需要花费大量的时间来定位记录。在该表的常用查询列上创建索引可以大大提高查询性能。
-
在使用索引时需要注意的是,过多或错误地使用索引可能会导致性能下降。因此,需要根据具体情况进行权衡,选择合适的索引策略。同时,也需要注意索引对数据库性能的影响,避免过度索引。
四、索引分类
1.索引分类
主键索引、唯一索引、普通索引、全文索引和组合索引都是常见的索引类型。它们的主要区别在于索引的实现方式和应用场景。
-
主键索引:主键索引是一种唯一索引,用于标识表中每一行数据的唯一性。主键索引可以加快对表中数据的访问速度,同时也可以提高数据的完整性和一致性。主键索引通常是在表的主键列上创建的,可以通过自增ID或唯一标识符等方式创建。
-
唯一索引:唯一索引用于确保表中某一列的唯一性。唯一索引可以用于加速查找和避免重复插入数据。与主键索引不同的是,唯一索引可以在表的任何列上创建,而不一定是主键列。
-
普通索引:普通索引也称为非唯一索引,用于加速对表中数据的查找和排序。普通索引可以在表的任何列上创建,包括数字型、字符型和日期型等列。
-
全文索引:全文索引用于对文本内容进行搜索。全文索引可以在文本中查找关键词并返回相关的记录。全文索引适用于处理大量文本数据的场景,例如搜索引擎。
-
组合索引:组合索引是一种在多列上创建的索引,用于加速对多个列的组合查询。组合索引可以提高查询性能,同时也可以减少索引文件的数量,节约磁盘空间。
-
总之,在实际使用中,需要根据数据的特点和应用场景选择适合的索引类型,以提高数据库的查询性能和数据的完整性。同时,也需要注意索引的使用不当可能会带来一些负面影响,例如增加系统资源的消耗和查询性能的下降等。
五、索引的创建
1.普通索引
(1)直接创建
创建普通索引
查看普通索引
(2)创建表的方式创建普通索引
创建表时创建索引
查看索引
(3)修改表方式创建
alter添加索引
查看索引
2、唯一索引
与普通索引类似,但区别是唯一索引列的每个值都唯一。
唯一索引允许有空值(注意和主键不同)。如果是用组合索引创建,则列值的组合必须唯一。添加唯一键将自动创建唯一索引。
(1)直接创建唯一索引
查看唯一索引
(2)修改表方式创建
查看唯一索引
(3)创建表的方式创建
查看唯一索引
3、主键索引
主键索引是一种特殊的唯一索引,必须指定为“PRIMARY KEY”。
一个表只能有一个主键,不允许有空值。 添加主键将自动创建主键索引。
(1)创建表时创建索引
查看索引
(2)修改表方式创建
创建索引
4、组合索引
可以是单列上创建的索引,也可以是在多列上创建的索引。需要满足最左原则,因为select语句的 where条件是依次从左往右执行的,所以在使用select 语句查询时where条件使用的字段顺序必须和组合索引中的排序一致,否则索引将不会生效。
(1)创建表时创建索引
查看索引
5、全文索引
适合在进行模糊查询的时候使用,可用于在一篇文章中检索文本信息。
(1)直接创建索引
创建索引
查询索引
(2)修改表方式创建
查询表索引
(3)创建表的时候指定索引
查询索引
六、索引的管理
1.查询索引
(1)show index from 表
(2)show keys from 表名;
(3)show create table 表;
2.删除索引
(1)直接删除
原本的索引
直接删除
id索引直接删除
(2)修改表方式删除索引
(3)删除主键索引
查看原来的索引
删除后没有
扩展:使用解释函数explain,只需添加在sql语句之前即可
七、总结
索引是数据库中用于提高查询性能的重要工具,可以加速对表中数据的查找、排序和过滤操作。常见的索引类型包括主键索引、唯一索引、普通索引、前缀索引、全文索引和组合索引等。不同类型的索引适用于不同的场景和数据类型,需要根据具体情况选择合适的索引类型,以提高数据库的查询性能。同时,索引的使用也需要注意不当可能会带来一些负面影响,例如增加系统资源的消耗和查询性能的下降等。因此,在使用索引时应该权衡其使用的成本和收益,并进行必要的优化和调整,以获得最佳的查询性能和数据完整性。可以使用explain查看是否使用索引。