zoukankan      html  css  js  c++  java
  • MySQL--索引

    什么是索引

    MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构

    Eg:拿汉语字典的目录页(索引)打比方,我们可以按拼音、笔画、偏旁部首等排序的目录(索引)快速查找到需要的字。

    索引的优缺点

    优点(目的):在于提高查询效率;

    缺点:会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。建立索引会占用磁盘空间的索引文件。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。

    索引类型

    MySQL目前主要有以下几种索引类型:

    1)普通索引 。

    是最基本的索引,它没有任何限制.

    2)唯一索引

    与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一.

    3)主键索引

    是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值。

    4)组合索引

    指多个字段上创建的索引,只有在查询条件中使用了创建一个字段,索引才会被使用。使用组合索引时遵循最左前缀。

    5)全文索引

    主要用来查找文本中的关键字,而不是直接与索引中的值相比较.主要针对文本文件,比如文章,标题,全文索引只有MyISAM有效(mysql5.6之后InnoDB也支持了全文索引)

    主键和唯一索引的区别?

    1)主键一定是唯一性索引,唯一性索引并不一定就是主键。

    2)一个表中可以有多个唯一性索引,但只能有一个主键。

    3)主键列不允许空值,而唯一性索引列允许空值。

    补充介绍:

    主键(primary key) 能够唯一标识表中某一行的属性或属性组。一个表只能有一个主键,但可以有多个候选索引。主键常常与外键构成参照完整性约束,防止出现数据不一致。主键可以保证记录的唯一和主键域非空,数据库管理系统对于主键自动生成唯一索引,所以主键也是一个特殊的索引。

    外键(foreign key) 是用于建立和加强两个表数据之间的链接的一列或多列。外键约束主要用来维护两个表之间数据的一致性。简言之,表的外键就是另一表的主键,外键将两表联系起来。一般情况下,要删除一张表中的主键必须首先要确保其它表中的没有相同外键(即该表中的主键没有一个外键和它相关联)。

    索引(index) 是用来快速地寻找那些具有特定值的记录。主要是为了检索的方便,是为了加快访问速度, 按一定的规则创建的,一般起到排序作用。所谓唯一性索引,这种索引和前面的“普通索引”基本相同,但有一个区别:索引列的所有值都只能出现一次,即必须唯一

    应该在哪些字段上添加索引呢?

    1、频繁查询的字段(经常出现在where条件后面的字段),应该创建索引。

    2、更新不频繁的字段,可以创建索引,更新非常频繁的字段,不应该创建索引,。

    3、唯一性太差(有大量数据重复)的字段,比如像性别(sex)字段,就不应该创建索引。因为当索引列有大量数据重复时,SQL查询可能不会去利用索引,如一表中有字段性别(sex),男女几乎各一半,那么即使在sex上建了索引也对查询效率起不了作用。

    4、不会出现在where条件之后的字段,不应该创建索引。

    联合索引

    如果多条件联合查询时最好建联合索引,查询效率会更高,因为当有多个单列索引时,MySQL只能用到其中那个它认为最有效率的单列索引。

    联合索引又叫复合索引。对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找 .当最左侧字段是常量引用时,索引就十分有效

    注意:b,a的组合也会触发索引,MySQL优化器会优化为a,b的排序

    利用索引中的附加列,您可以缩小搜索的范围,但使用一个具有两列的索引 不同于使用两个单独的索引。复合索引的结构与电话簿类似,人名由姓和名构成,电话簿首先按姓氏对进行排序,然后按名字对有相同姓氏的人进行排序。如果您知 道姓,电话簿将非常有用;如果您知道姓和名,电话簿则更为有用,但如果您只知道名不姓,电话簿将没有用处。

    所以说创建复合索引时,应该仔细考虑列的顺序。对索引中的所有列执行搜索或仅对前几列执行搜索时,复合索引非常有用;仅对后面的任意列执行搜索时,复合索引则没有用处。

    索引的数据结构是什么?

    B-Tree(BTree)和B + Tree

     参考

    你确定真正理解联合索引和最左前缀原则?--

    https://cloud.tencent.com/developer/article/1485777

    如何计算mysql索引key_len --

    https://blog.csdn.net/liweizhong193516/article/details/54580773

    mysql联合索引的使用规则 --

    https://blog.csdn.net/wdjxxl/article/details/79790421

    希望本文章对您有帮助,您的转发、点赞是我的创作动力,十分感谢。更多好文推荐,请关注我的微信公众号--JustJavaIt
  • 相关阅读:
    [转]我们都是花栗鼠
    学习Tkinter
    彻底理解Python切片
    信息隐藏技术
    Hex棋
    web服务器一些概念
    Redis学习笔记
    Python知识总结(二)
    Python知识总结
    最小联结词组
  • 原文地址:https://www.cnblogs.com/liaowenhui/p/12347391.html
Copyright © 2011-2022 走看看