精华内容
下载资源
问答
  • mysql索引
    千次阅读
    2021-01-19 03:17:33

    开门见山,直接上图,下面的思维导图即是现在要讲的内容,可以先有个印象~

    1ca59bb97502e1a2bf4092f98e0ada15.png

    常见索引类型(实现层面)

    索引种类(应用层面)

    聚簇索引与非聚簇索引

    覆盖索引

    最佳索引使用策略

    1.常见索引类型(实现层面)

    首先不谈Mysql怎么实现索引的,先马后炮一下,如果让我们来设计数据库的索引,该怎么设计?

    我们首先思考一下索引到底想达到什么效果?其实就是想能够实现快速查找数据的策略,所以索引的实现本质上就是一个查找算法。

    但是跟普通的查找有所不同,因为我们的数据有一下特征:

    1.存储的数据是非常非常多的

    2.并且还不断的动态变化

    所以实现索引时需要考虑到这两个特点。我们需要找一个最合适的数据结构算法来实现查找功能。

    下面一起看下常见的查找策略,如下图:

    85e1c7e840fdb5dc0b7a7ec133bf6194.png

    由于前面说的两个特点我们首先排除静态查找的算法。

    至于查找树,我们有二叉树和多叉树两种选择:

    二叉树:如果先泽二叉树的话,由于我们的数据量庞大,二叉树的深度会变得非

    更多相关内容
  • mysql索引详解

    万次阅读 多人点赞 2021-07-07 21:40:09
    一、MySQL三层逻辑架构 MySQL的存储引擎架构将查询处理与数据的存储/提取相分离。下面是MySQL的逻辑架构图: 一、对比InnoDB与MyISAM 1、 存储结构 MyISAM:每个MyISAM在磁盘上存储成三个文件。分别为:表定义...

    🍅 作者简介:哪吒,CSDN2021博客之星亚军🏆、新星计划导师✌、博客专家💪

    🍅 哪吒多年工作总结:Java学习路线总结,搬砖工逆袭Java架构师

    🍅 关注公众号【哪吒编程】,回复1024,获取Java学习路线思维导图、大厂面试真题、加入万粉计划交流群、一起学习进步

    目录

    一、MySQL三层逻辑架构

    1、第一层负责连接管理、授权认证、安全等等。

    2、第二层负责解析查询

    3、第三层是存储引擎

    二、对比InnoDB与MyISAM

    1、 存储结构

    2、 存储空间

    3、 可移植性、备份及恢复

    4、 事务支持

    5、 AUTO_INCREMENT

    6、 表锁差异

    7、 全文索引

    8、表主键

    9、表的具体行数

    10、CRUD操作

    11、 外键

    三、sql优化简介

    1、什么情况下进行sql优化

    2、sql语句执行过程

    3、sql优化就是优化索引

    四、索引

    1、索引的优势

    2、索引的弊端

    3、索引的分类

    4、创建索引

    5、MySQL索引原理 -> B+树

    五、如何触发联合索引

    1、对user表建立联合索引username、password

    2、触发联合索引

    六、分析sql的执行计划---explain

    1、explan使用简介

    2、explain查询结果简介


    一、MySQL三层逻辑架构

    MySQL的存储引擎架构将查询处理与数据的存储/提取相分离。下面是MySQL的逻辑架构图:

    1、第一层负责连接管理、授权认证、安全等等。

    每个客户端的连接都对应着服务器上的一个线程。服务器上维护了一个线程池,避免为每个连接都创建销毁一个线程。当客户端连接到MySQL服务器时,服务器对其进行认证。可以通过用户名和密码的方式进行认证,也可以通过SSL证书进行认证。登录认证通过后,服务器还会验证该客户端是否有执行某个查询的权限。

    2、第二层负责解析查询

    编译SQL,并对其进行优化(如调整表的读取顺序,选择合适的索引等)。对于SELECT语句,在解析查询前,服务器会先检查查询缓存,如果能在其中找到对应的查询结果,则无需再进行查询解析、优化等过程,直接返回查询结果。存储过程、触发器、视图等都在这一层实现。

    3、第三层是存储引擎

    存储引擎负责在MySQL中存储数据、提取数据、开启一个事务等等。存储引擎通过API与上层进行通信,这些API屏蔽了不同存储引擎之间的差异,使得这些差异对上层查询过程透明。存储引擎不会去解析SQL。

    二、对比InnoDB与MyISAM

    1、 存储结构

    MyISAM:每个MyISAM在磁盘上存储成三个文件。分别为:表定义文件、数据文件、索引文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex)。

    InnoDB:所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB表的大小只受限于操作系统文件的大小,一般为2GB。

    2、 存储空间

    MyISAM: MyISAM支持支持三种不同的存储格式:静态表(默认,但是注意数据末尾不能有空格,会被去掉)、动态表、压缩表。当表在创建之后并导入数据之后,不会再进行修改操作,可以使用压缩表,极大的减少磁盘的空间占用。

    InnoDB: 需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。

    3、 可移植性、备份及恢复

    MyISAM:数据是以文件的形式存储,所以在跨平台的数据转移中会很方便。在备份和恢复时可单独针对某个表进行操作。

    InnoDB:免费的方案可以是拷贝数据文件、备份 binlog,或者用 mysqldump,在数据量达到几十G的时候就相对痛苦了。

    4、 事务支持

    MyISAM:强调的是性能,每次查询具有原子性,其执行数度比InnoDB类型更快,但是不提供事务支持。

    InnoDB:提供事务支持事务,外部键等高级数据库功能。 具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。

    5、 AUTO_INCREMENT

    MyISAM:可以和其他字段一起建立联合索引。引擎的自动增长列必须是索引,如果是组合索引,自动增长可以不是第一列,他可以根据前面几列进行排序后递增。

    InnoDB:InnoDB中必须包含只有该字段的索引。引擎的自动增长列必须是索引,如果是组合索引也必须是组合索引的第一列。

    6、 表锁差异

    MyISAM: 只支持表级锁,用户在操作myisam表时,select,update,delete,insert语句都会给表自动加锁,如果加锁以后的表满足insert并发的情况下,可以在表的尾部插入新的数据。

    InnoDB: 支持事务和行级锁,是innodb的最大特色。行锁大幅度提高了多用户并发操作的新能。但是InnoDB的行锁,只是在WHERE的主键是有效的,非主键的WHERE都会锁全表的。

    7、 全文索引

    MyISAM:支持 FULLTEXT类型的全文索引

    InnoDB:不支持FULLTEXT类型的全文索引,但是innodb可以使用sphinx插件支持全文索引,并且效果更好。

    8、表主键

    MyISAM:允许没有任何索引和主键的表存在,索引都是保存行的地址。

    InnoDB:如果没有设定主键或者非空唯一索引,就会自动生成一个6字节的主键(用户不可见),数据是主索引的一部分,附加索引保存的是主索引的值。

    9、表的具体行数

    MyISAM: 保存有表的总行数,如果select count() from table;会直接取出出该值。

    InnoDB: 没有保存表的总行数,如果使用select count(*) from table;就会遍历整个表,消耗相当大,但是在加了wehre条件后,myisam和innodb处理的方式都一样。

    10、CRUD操作

    MyISAM:如果执行大量的SELECT,MyISAM是更好的选择。

    InnoDB:如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表。

    11、 外键

    MyISAM:不支持

    InnoDB:支持

    三、sql优化简介

    1、什么情况下进行sql优化

    性能低、执行时间太长、等待时间太长、连接查询、索引失效。

    2、sql语句执行过程

    (1)编写过程

    select distinct ... from ... join ... on ... where ... group by ... having ... order by ... limit ...

    (2)解析过程

    from ... on ... join ... where ... group by ... having ... select distinct ... order by ... limit ...

    3、sql优化就是优化索引

    索引相当于书的目录。

    索引的数据结构是B+树。

    四、索引

    1、索引的优势

    (1)提高查询效率(降低IO使用率)

    (2)降低CPU使用率

    比如查询order by age desc,因为B+索引树本身就是排好序的,所以再查询如果触发索引,就不用再重新查询了。

    2、索引的弊端

    (1)索引本身很大,可以存放在内存或硬盘上,通常存储在硬盘上。

    (2)索引不是所有情况都使用,比如①少量数据②频繁变化的字段③很少使用的字段

    (3)索引会降低增删改的效率

    3、索引的分类

    (1)单值索引

    (2)唯一索引

    (3)联合索引

    (4)主键索引

    备注:唯一索引和主键索引唯一的区别:主键索引不能为null

    4、创建索引

    alter table user add INDEX `user_index_username_password` (`username`,`password`)

    5、MySQL索引原理 -> B+树

    MySQL索引的底层数据结构是B+树

    B+Tree是在B-Tree基础上的一种优化,使其更适合实现外存储索引结构,InnoDB存储引擎就是用B+Tree实现其索引结构。

    B-Tree结构图中每个节点中不仅包含数据的key值,还有data值。而每一个页的存储空间是有限的,如果data数据较大时将会导致每个节点(即一个页)能存储的key的数量很小,当存储的数据量很大时同样会导致B-Tree的深度较大,增大查询时的磁盘I/O次数,进而影响查询效率。在B+Tree中,所有数据记录节点都是按照键值大小顺序存放在同一层的叶子节点上,而非叶子节点上只存储key值信息,这样可以大大加大每个节点存储的key值数量,降低B+Tree的高度。

    B+Tree相对于B-Tree有几点不同:

    非叶子节点只存储键值信息。
    所有叶子节点之间都有一个链指针。
    数据记录都存放在叶子节点中。
    将上一节中的B-Tree优化,由于B+Tree的非叶子节点只存储键值信息,假设每个磁盘块能存储4个键值及指针信息,则变成B+Tree后其结构如下图所示:

    通常在B+Tree上有两个头指针,一个指向根节点,另一个指向关键字最小的叶子节点,而且所有叶子节点(即数据节点)之间是一种链式环结构。因此可以对B+Tree进行两种查找运算:一种是对于主键的范围查找和分页查找,另一种是从根节点开始,进行随机查找。

    可能上面例子中只有22条数据记录,看不出B+Tree的优点,下面做一个推算:

    InnoDB存储引擎中页的大小为16KB,一般表的主键类型为INT(占用4个字节)或BIGINT(占用8个字节),指针类型也一般为4或8个字节,也就是说一个页(B+Tree中的一个节点)中大概存储16KB/(8B+8B)=1K个键值(因为是估值,为方便计算,这里的K取值为〖10〗^3)。也就是说一个深度为3的B+Tree索引可以维护10^3 * 10^3 * 10^3 = 10亿 条记录。

    实际情况中每个节点可能不能填充满,因此在数据库中,B+Tree的高度一般都在2~4层。MySQL的InnoDB存储引擎在设计时是将根节点常驻内存的,也就是说查找某一键值的行记录时最多只需要1~3次磁盘I/O操作。

    数据库中的B+Tree索引可以分为聚集索引(clustered index)和辅助索引(secondary index)。上面的B+Tree示例图在数据库中的实现即为聚集索引,聚集索引的B+Tree中的叶子节点存放的是整张表的行记录数据。辅助索引与聚集索引的区别在于辅助索引的叶子节点并不包含行记录的全部数据,而是存储相应行数据的聚集索引键,即主键。当通过辅助索引来查询数据时,InnoDB存储引擎会遍历辅助索引找到主键,然后再通过主键在聚集索引中找到完整的行记录数据。

    五、如何触发联合索引

    1、对user表建立联合索引username、password

    2、触发联合索引

    (1)使用联合索引的全部索引键可触发联合索引

    (2)使用联合索引的全部索引键,但是用or连接的,不可触发联合索引

    (3)单独使用联合索引的左边第一个字段时,可触发联合索引

    (4)单独使用联合索引的其它字段时,不可触发联合索引

    六、分析sql的执行计划---explain

    explain可以模拟sql优化执行sql语句。

    1、explan使用简介

    (1)用户表

    (2)部门表

    (3)未触发索引

    (4)触发索引

    (5)结果分析

    explain中第一行出现的表是驱动表。

    1. 指定了联接条件时,满足查询条件的记录行数少的表为[驱动表]
    2. 未指定联接条件时,行数少的表为[驱动表]

    对驱动表直接进行排序就会触发索引,对非驱动表进行排序不会触发索引。

    2、explain查询结果简介

    (1)id:SELECT识别符。这是SELECT的查询序列号。

    (2)select_type:SELECT类型:

    1. SIMPLE: 简单SELECT(不使用UNION或子查询)
    2. PRIMARY: 最外面的SELECT
    3. UNION:UNION中的第二个或后面的SELECT语句
    4. DEPENDENT UNION:UNION中的第二个或后面的SELECT语句,取决于外面的查询
    5. UNION RESULT:UNION的结果
    6. SUBQUERY:子查询中的第一个SELECT
    7. DEPENDENT SUBQUERY:子查询中的第一个SELECT,取决于外面的查询
    8. DERIVED:导出表的SELECT(FROM子句的子查询)

    (3)table:表名

    (4)type:联接类型

    1. system:表仅有一行(=系统表)。这是const联接类型的一个特例。
    2. const:表最多有一个匹配行,它将在查询开始时被读取。因为仅有一行,在这行的列值可被优化器剩余部分认为是常数。const用于用常数值比较PRIMARY KEY或UNIQUE索引的所有部分时。
    3. eq_ref:对于每个来自于前面的表的行组合,从该表中读取一行。这可能是最好的联接类型,除了const类型。它用在一个索引的所有部分被联接使用并且索引是UNIQUE或PRIMARY KEY。eq_ref可以用于使用= 操作符比较的带索引的列。比较值可以为常量或一个使用在该表前面所读取的表的列的表达式。
    4. ref:对于每个来自于前面的表的行组合,所有有匹配索引值的行将从这张表中读取。如果联接只使用键的最左边的前缀,或如果键不是UNIQUE或PRIMARY KEY(换句话说,如果联接不能基于关键字选择单个行的话),则使用ref。如果使用的键仅仅匹配少量行,该联接类型是不错的。ref可以用于使用=或<=>操作符的带索引的列。
    5. ref_or_null:该联接类型如同ref,但是添加了MySQL可以专门搜索包含NULL值的行。在解决子查询中经常使用该联接类型的优化。
    6. index_merge:该联接类型表示使用了索引合并优化方法。在这种情况下,key列包含了使用的索引的清单,key_len包含了使用的索引的最长的关键元素。
    7. unique_subquery:该类型替换了下面形式的IN子查询的ref:value IN (SELECT primary_key FROMsingle_table WHERE some_expr);unique_subquery是一个索引查找函数,可以完全替换子查询,效率更高。
    8. index_subquery:该联接类型类似于unique_subquery。可以替换IN子查询,但只适合下列形式的子查询中的非唯一索引:value IN (SELECT key_column FROM single_table WHERE some_expr)
    9. range:只检索给定范围的行,使用一个索引来选择行。key列显示使用了哪个索引。key_len包含所使用索引的最长关键元素。在该类型中ref列为NULL。当使用=、<>、>、>=、<、<=、IS NULL、<=>、BETWEEN或者IN操作符,用常量比较关键字列时,可以使用range
    10. index:该联接类型与ALL相同,除了只有索引树被扫描。这通常比ALL快,因为索引文件通常比数据文件小。
    11. all:对于每个来自于先前的表的行组合,进行完整的表扫描。如果表是第一个没标记const的表,这通常不好,并且通常在它情况下很差。通常可以增加更多的索引而不要使用ALL,使得行能基于前面的表中的常数值或列值被检索出。

    (5)possible_keys:possible_keys列指出MySQL能使用哪个索引在该表中找到行。注意,该列完全独立于EXPLAIN输出所示的表的次序。这意味着在possible_keys中的某些键实际上不能按生成的表次序使用。

    (6)key:key列显示MySQL实际决定使用的键(索引)。如果没有选择索引,键是NULL。要想强制MySQL使用或忽视possible_keys列中的索引,在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。

    (7)key_len:key_len列显示MySQL决定使用的键长度。如果键是NULL,则长度为NULL。注意通过key_len值我们可以确定MySQL将实际使用一个多部关键字的几个部分。

    (8)ref:ref列显示使用哪个列或常数与key一起从表中选择行。

    (9)rows:rows列显示MySQL认为它执行查询时必须检查的行数。

    (10)Extra:该列包含MySQL解决查询的详细信息。

    1. Distinct:MySQL发现第1个匹配行后,停止为当前的行组合搜索更多的行。
    2. Not exists:MySQL能够对查询进行LEFT JOIN优化,发现1个匹配LEFT JOIN标准的行后,不再为前面的的行组合在该表内检查更多的行。
    3. range checked for each record (index map: #):MySQL没有发现好的可以使用的索引,但发现如果来自前面的表的列值已知,可能部分索引可以使用。对前面的表的每个行组合,MySQL检查是否可以使用range或index_merge访问方法来索取行。
    4. Using filesort:MySQL需要额外的一次传递,以找出如何按排序顺序检索行。通过根据联接类型浏览所有行并为所有匹配WHERE子句的行保存排序关键字和行的指针来完成排序。然后关键字被排序,并按排序顺序检索行。
    5. Using index:从只使用索引树中的信息而不需要进一步搜索读取实际的行来检索表中的列信息。当查询只使用作为单一索引一部分的列时,可以使用该策略。
    6. Using temporary:为了解决查询,MySQL需要创建一个临时表来容纳结果。典型情况如查询包含可以按不同情况列出列的GROUP BY和ORDER BY子句时。
    7. Using where:WHERE子句用于限制哪一个行匹配下一个表或发送到客户。除非你专门从表中索取或检查所有行,如果Extra值不为Using where并且表联接类型为ALL或index,查询可能会有一些错误。
    8. Using sort_union(...), Using union(...), Using intersect(...):这些函数说明如何为index_merge联接类型合并索引扫描。
    9. Using index for group-by:类似于访问表的Using index方式,Using index for group-by表示MySQL发现了一个索引,可以用来查询GROUP BY或DISTINCT查询的所有列,而不要额外搜索硬盘访问实际的表。并且,按最有效的方式使用索引,以便对于每个组,只读取少量索引条目。

    通过相乘EXPLAIN输出的rows列的所有值,你能得到一个关于一个联接如何的提示。这应该粗略地告诉你MySQL必须检查多少行以执行查询。当你使用max_join_size变量限制查询时,也用这个乘积来确定执行哪个多表SELECT语句。

    🍅 作者简介:哪吒,CSDN2021博客之星亚军🏆、新星计划导师✌、博客专家💪

    🍅 哪吒多年工作总结:Java学习路线总结,搬砖工逆袭Java架构师

    🍅 关注公众号【哪吒编程】,回复1024,获取Java学习路线思维导图、大厂面试真题、加入万粉计划交流群、一起学习进步

    关注公众号,回复1024,获取Java学习路线思维导图,加入万粉计划交流群

    展开全文
  • MySql索引

    千次阅读 2021-01-18 21:12:40
    索引简介索引是一个单独的、物理的数据库结构,它是某个表中一列或若干列值的集合与相应的指向表中数据的指针组成清单。索引的作用相当于书的目录,可以根据目录中的页码快速定位到所需的内容。索引是一种使记录有序...

    索引简介

    索引是一个单独的、物理的数据库结构,它是某个表中一列或若干列值的集合与相应的指向表中数据的指针组成清单。索引的作用相当于书的目录,可以根据目录中的页码快速定位到所需的内容。索引是一种使记录有序化的技术,它从逻辑上对记录进行排序而不影响物理存储的数据。

    优点:

    加速数据检索

    创建唯一可以索引保证每一行数据的唯一性

    加速连接查询、排序、分组操作

    缺点:

    需要额外的物理空间进行存储

    数据增删改的时候需要动态维护索引,耗费时间

    增加优化器在选择索引时的计算代价

    注意:要合理选择必要的字段建立索引!

    索引类型

    普通索引:这是最基本的索引,它没有任何限制。

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

    主键索引:它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引。

    组合索引与单列索引:单列索引是针对一个字段创建的索引,组合索引是针对多个字段创建一个索引,但是如果字段顺序不同,那么代表索引也是不同的。

    聚集索引与非聚集索引:聚集索引表示表中存储的数据按照索引的顺序存储,检索效率比非聚集索引高,但对数据更新影响较大。非聚集索引表示数据存储在一个地方,索引存储在另一个地方,索引带有指针指向数据的存储位置,非聚集索引检索效率比聚集索引低,但对数据更新影响较小。

    索引结构

    Hash索引

    将索引键通过 Hash 运算之后,将 Hash运算结果的 Hash 值和所对应的行指针信息存放于一个 Hash 表中。

    优点:通过哈希运算得到的hash值一次定位,适合精准查询。

    缺点:索引中保存的是hash值,hash值的大小关系同原值的大小关系不能保证一致,因此不能用于“like”等范围查询和排序,此外还不能利用组合索引的部分查询特性。由于还需通过行指针访问实际的表数据,因此不能避免对表的扫描。

    B-tree索引

    B-Tree(平衡多路查找树)的特性:一个度为d的B-Tree,设其索引N个key,则其树高h的上限为logd((N+1)/2),检索一个key,其查找节点个数的渐进复杂度为O(logdN) 。

    e62f19a1696c474382a286125a3e7c16.png

    由于索引本身也很大,不可能全部存储在内存中,因此索引往往也是以索引文件的形式存储的磁盘上,树状结构可以大大减少磁盘IO次数已提高查询速度。根据局部性原理和磁盘预读特性,数据库系统将一个节点的大小设为磁盘一个页的大小,这样每个节点的数据只需一次IO就能载入。实际应用中B树的度往往大于100即百万级数据也只需3次IO。

    Mysql使用的Innodb 存储引擎中 B-Tree 索引使用的存储结构实际上是 B+Tree,它是B-Tree的变种,相比B-Tree,B+Tree的内部节点不保存关键字对应的指针,因此每个节点可以容纳更多的关键字,相对的可以减少磁盘IO次数。另外每个叶子节点会保存相邻的后一个叶子节点的指针,可以加速多个相邻叶子节点的检索。

    f1aa6e2e0477407f3d2a121c1daa6f37.png

    创建索引

    可视化工具创建

    4b92dabf3c170a015ce94014b2722d21.png

    sql语句

    CREATE INDEX [IDXNAME] ON [TABLE]([FIELD]([LENGTH]))

    ALTER TABLE [TABLE] ADD INDEX [IDXNAME]([FIELD]([LENGTH]))

    索引使用情景(重要)

    适合创建索引条件

    出现在on 条件或where条件中的列

    经常用于排序或分组的列

    经常使用聚集函数(如COUNT/MIN/MAX/SUM)的列

    不适合创建索引的条件

    频繁新增、修改删除的表

    数据量比较小的表

    选择性不高的列(例如性别)

    使用索引注意事项

    索引应该建在选择性高的字段上(键值唯一的记录数/总记录条数),选择性越高索引的效果越好、价值越大,唯一索引的选择性最高

    组合索引中字段的顺序,选择性越高的字段排在最前面

    不要重复创建彼此有包含关系的索引,如index1(a,b,c) 、index2(a,b)、index3(a) (最左前缀原理)

    索引值不应过大,组合索引的字段不要过多,如果超过4个字段,一般需要考虑拆分成多个单列索

    数据量较少的时候,全表扫描比使用索引快,则不使用索引

    索引列不能包含NULL,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的

    使用短索引

    导致索引失效的情况

    对索引列进行运算 错误: select * from test where id-1=9;

    使用or操作符(对所有列设置单列索引,union)

    使用not in ,not exist,<>

    %开头的like

    组合索引的索引列以不同顺序排序或先后顺序不同

    条件中不含组合索引的中间字段

    无条件检索全部记录

    展开全文
  • Mysql索引:图文并茂,深入探究索引的原理和使用

    万次阅读 多人点赞 2020-11-25 16:43:44
    关于Mysql索引的走心总结,建议收藏,反复阅读。

    前言

    相信每个IT界大佬,简历上少不了Mysql索引这个关键字,但如果被问起来,你能说出多少干货呢?先看下面几个问题测试一下吧:

    • 索引是怎么提高查询效率的?可以为了提高查询效率增加索引么?
    • mysql索引系统采用的数据结构是什么?
    • 为什么要使用B+树?
    • 聚集索引相对于非聚集索引的区别?
    • 什么是回表?
    • 什么是索引覆盖?
    • 什么是最左匹配原则?
    • 索引失效场景有哪些,如何避免?

    这些问题说不明白?不要慌!请带着问题向下看。
    在这里插入图片描述

    1 索引原理探究

    什么是数据库索引?先来个官方一些的定义吧。

    在关系数据库中,索引是一种单独的、物理的数对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。

    这段话有点绕,其实把索引理解为图书目录,就非常好理解了。

    如果我们想在图书中查找特定内容,在没有目录的情况下只能逐页翻找。与此类似,当执行下面这样一条SQL语句时,假如没有索引,数据库如何查找到相对应的记录呢?

    SELECT * FROM student WHERE name='叶良辰'
    

    搜索引擎只能扫描整个表的每一行,并依次对比判断name的值是否等于“叶良辰”。我们知道,单纯的内存运算是很快的,但从磁盘中取数据到内存中是相对慢的,当表中有大量数据时,内存与磁盘交互次数大大增加,这就导致了查询效率低下。

    1.1 B树与B+树

    相对于cpu和内存操作,磁盘IO开销很大,非常容易成为系统的性能瓶颈,因此计算机操作系统做了一些优化:

    当一次IO时,将相邻的数据也都读取到内存缓冲区内,而不是仅仅读取当前磁盘地址的数据。因为局部预读性原理告诉我们,当计算机访问一个地址的数据的时候,与其相邻的数据也会很快被访问到。每一次IO读取的数据我们称之为一页(page)。具体一页有多大数据跟操作系统有关,一般为4k或8k,也就是我们读取一页内的数据时候,实际上才发生了一次IO,这个理论对于索引的数据结构设计非常有帮助。

    为什么索引能提升数据库查询效率呢?根本原因就在于索引减少了查询过程中的IO次数。那么它是如何做到的呢?使用B+树。下面先简单了解一下B树和B+树。

    B树,即平衡多路查找树(B-Tree),是为磁盘等外存储设备设计的一种平衡查找树。

    B树简略示意图:
    在这里插入图片描述
    观察上图可见B树的两个特点:

    1. 树内的每个节点都存储数据
    2. 叶子节点之间无指针连接

    B+树简略示意图:
    在这里插入图片描述
    再看B+树相对于B树的两个特点:

    1. 数据只出现在叶子节点
    2. 所有叶子节点增加了一个链指针

    叶子结点是离散数学中的概念。一棵树当中没有子结点(即度为0)的结点称为叶子结点,简称“叶子”。 叶子是指出度为0的结点,又称为终端结点。

    但是,为什么是B+树而不是B树呢?原因有两点:

    1. B树每个节点中不仅包含数据的key值,还有data值。而每一个页的存储空间是有限的,如果data数据较大时将会导致每个节点能存储的key的数量很小,要保存同样多的key,就需要增加树的高度。树的高度每增加一层,查询时的磁盘I/O次数就增加一次,进而影响查询效率。而在B+Tree中,所有数据记录节点都是按照键值大小顺序存放在同一层的叶子节点上,而非叶子节点上只存储key值信息,这样可以大大加大每个节点存储的key值数量,降低B+树的高度。
    2. B+树的叶子节点上有指针进行相连,因此在做数据遍历的时候,只需要对叶子节点进行遍历即可,这个特性使得B+树非常适合做范围查询。

    1.2 聚簇索引与非聚簇索引

    首先,为了方便理解,我们先了解一下聚集索引(clustered index)和非聚集索引(secondary index,也称辅助索引或普通索引)。这两种索引是按存储方式进行区分的。

    聚集索引(clustered)也称聚簇索引,这种索引中,数据库表行中数据的物理顺序与键值的逻辑(索引)顺序相同。一个表的物理顺序只有一种情况,因此对应的聚集索引只能有一个。如果某索引不是聚集索引,则表中的行物理顺序与索引顺序不匹配,与非聚集索引相比,聚集索引有着更快的检索速度。

    如果不好理解,请看下面这个表:

    idnamescore物理地址
    1叶良辰780×01
    2龙傲天880×02
    3赵日天560×03
    4徐胜虎770×04

    表中id和物理地址是保持一致顺序的,id较大的行,其物理地址也比较靠后。因为聚集索引的特性,它的建立有一定的特殊要求:

    1. Innodb中,聚簇索引默认就是主键索引。
    2. 如果表中没有定义主键,那么该表的第一个唯一非空索引被作为聚集索引。
    3. 如果没有主键也没有合适的唯一索引,那么innodb内部会生成一个隐藏的主键作为聚集索引,这个隐藏的主键是一个6个字节的列,改列的值会随着数据的插入自增。

    大家还记得,自增主键和uuid作为主键的区别么?由于主键使用了聚集索引,如果主键是自增id,那么对应的数据一定也是相邻地存放在磁盘上的,写入性能比较高。如果是uuid的形式,频繁的插入会使innodb频繁地移动磁盘块,写入性能就比较低了。

    1.3 索引原理图示

    下面用一个通过主键索引查找数据的案例演示一下索引的原理。假如有student表如下,id上建立了聚集索引,name上建立非聚集索引:

    idnamescore
    2叶良辰78
    4龙傲天88
    10赵日天56
    11徐胜虎77

    1.3.1 聚簇索引

    当我们执行下面的语句时,

    SELECT name FROM student WHERE id=2
    

    查询过程如下图所示:
    在这里插入图片描述

    用语言描述一下,是这样的:

    1. 先找到根节点所在磁盘块,读入内存。(第1次磁盘I/O操作)
    2. 在内存中判断id=3所在区间(0,8),找到该区间对应的指针1(第1次内存查找)
    3. 根据指针1记录的磁盘地址,找到磁盘块2并读入内存(第2次磁盘I/O操作)
    4. 在内存中判断id=3所在区间(0,4),找到该区间对应的指针2(第2次内存查找)
    5. 根据指针2记录的磁盘地址,找到磁盘块4并读入内存(第3次磁盘I/O操作)
    6. 在内存中查找到id=2对应的数据行记录(第3次内存查找)

    我们知道,磁盘I/O相对于内存运算(尤其内存中的主键是有序排列的,利用二分查找等算法效率非常高)耗时高得多,因此在数据库查询中,减少磁盘访问时数据库的性能优化的主要手段。

    而分析上面过程,发现整个查询只需要3次磁盘I/O操作(其实InnoDB引擎是将根节点常驻内存的,第1次磁盘I/O操作并不存在)和3次内存查找操作。相对于不使用索引的遍历式查找,大大减少了对磁盘的访问,因此查找效率大幅提高。但是,因为索引树要与表中数据保持一致,因此当表发生数据增删改时,索引树也要相应修改,导致写数据比没有索引时开销大一些。

    1.3.2 非聚簇索引

    好,聚集索引看完后,再看非聚集索引。
    在这里插入图片描述
    如上图,多加一个索引,就会多生成一颗非聚簇索引树。因此,索引不能随意增加。在做写库操作的时候,需要同时维护这几颗树的变化,导致效率降低!

    另外,仔细观察的人一定会发现,不同于聚集索引,非聚集索引叶子节点上不再是真实数据,而是存储了索引字段自身值和主键索引。因此,当我们执行以下SQL语句时:

    SELECT id,name FROM student WHERE name='叶良辰';
    

    整个查询过程与聚集索引的过程一样,只需要扫描一次索引树(n次磁盘I/O和内存查询),即可拿到想要的数据。

    但是,如果查询name索引树没有的数据时,情况就不一样了:

    SELECT score FROM student WHERE name='叶良辰';
    

    在这里插入图片描述
    注意看上图中的红色箭头,因为扫描完name索引后,Mysql只能获取到对应的idname,然后用id的值再去聚集索引中去查询score的值。这个过程相对于聚集索引查询的效率下降,可以理解了吧。

    这就是通常所说的回表或者二次查询:使用聚集索引查询可以直接定位到记录,而普通索引通常需要扫描两遍索引树,即先通过普通索引定位到主键值,在通过聚集索引定位到行记录,这就是所谓的回表查询,它的性能比扫描一遍索引树低。

    既然普通索引会导致回表二次查询,那么有什么办法可以应对呢?建立联合索引!

    1.3.3 联合索引

    所谓联合索引,也称多列所谓,就是建立在多个字段上的索引,这个概念是跟单列索引相对的。联合索引依然是B+树,但联合索引的健值数量不是一个,而是多个。构建一颗B+树只能根据一个值来构建,因此数据库依据联合索引最左的字段来构建B+树。

    例如在a和b字段上建立联合索引,索引结构将如下图所示:
    在这里插入图片描述
    一目了然,当我们再执行SELECT score FROM student WHERE name='叶良辰';时,可以直接通过扫描非聚集索引直接获取score的值,而不再需要到聚集索引上二次扫描了。

    最左前缀匹配

    联合索引中有一个重要的课题,就是最左前缀匹配。

    最左前缀匹配原则:在MySQL建立联合索引时会遵守最左前缀匹配原则,即最左优先,在检索数据时从联合索引的最左边开始匹配。

    这是为什么呢?我们再仔细观察索引结构,可以看到索引key在排序上,首先按a排序,a相等的节点中,再按b排序。因此,如果查询条件是a或a和b联查时,是可以应用到索引的。如果查询条件是单独使用b,因为无法确定a的值,因此无法使用索引。

    假如在table表的a,b,c三个列上建立联合索引,简要分类分析下联合索引的最左前缀匹配。

    首先看等值查询:

    1、全值匹配查询时(where子句搜索条件顺序调换不影响索引使用,因为查询优化器会自动优化查询顺序 ),可以用到联合索引

    SELECT * FROM table WHERE a=1 AND b=3 AND c=2
    SELECT * FROM table WHERE b=3 AND c=4 AND a=2
    

    2、匹配左边的列时,可以用到联合索引

    SELECT * FROM table WHERE a=1
    SELECT * FROM table WHERE a=1 AND b=3
    

    3、未从最左列开始时,无法用到联合索引

    SELECT * FROM table WHERE b=1 AND b=3
    

    4、查询列不连续时,无法使用联合索引(会用到a列索引,但c排序依赖于b,所以会先通过a列的索引筛选出a=1的记录,再在这些记录中遍历筛选c=3的值,是一种不完全使用索引的情况)

    SELECT * FROM table WHERE a=1 AND c=3
    

    再看范围查询:

    1、范围查询最左列,可以使用联合索引

    SELECT * FROM table WHERE a>1 AND a<5;
    

    2、精确匹配最左列并范围匹配其右一列(a值确定时,b是有序的,因此可以使用联合索引)

    SELECT * FROM table WHERE a=1 AND b>3;
    

    3、精确匹配最左列并范围匹配非右一列(a值确定时,c排序依赖b,因此无法使用联合索引,但会使用a列索引筛选出a>2的记录行,再在这些行中条件 c >3逐条过滤)

    SELECT * FROM table WHERE a>2 AND c>5;
    

    索引的原理探究到此结束,这部分内容堪称最难啃的骨头。不过,能坚持读下来的朋友,你的收获也一定良多。接下来的内容就轻松愉悦多了。
    在这里插入图片描述

    2 索引的正确使用姿势

    索引的优点如下:

    • 通过创建唯一索引可以保证数据库表中每一行数据的唯一性。
    • 可以大大加快数据的查询速度,这是使用索引最主要的原因。
    • 在实现数据的参考完整性方面可以加速表与表之间的连接。
    • 在使用分组和排序子句进行数据查询时也可以显著减少查询中分组和排序的时间。

    既然索引这么好,那么我们是不是尽情使用索引呢?非也,索引优点明显,但相对应,也有缺点:

    • 创建和维护索引组要耗费时间,并且随着数据量的增加所耗费的时间也会增加。
    • 索引需要占磁盘空间,除了数据表占数据空间以外,每一个索引还要占一定的物理空间。
    • 当对表中的数据进行增加、删除和修改的时候,索引也要动态维护,这样就降低了数据的维护速度。

    因此,使用索引时要兼顾索引的优缺点,寻找一个最有利的平衡点。

    2.1 索引的类型区分

    InnoDB引擎为例,Mysql索引可以做如下区分。

    首先,索引可以分为聚集索引和非聚集索引,它们的区别和含义在前文有大幅介绍,此处不再赘述。

    其次,从逻辑上,索引可以区分为:

    • 普通索引:普通索引是 MySQL 中最基本的索引类型,它没有任何限制,唯一任务就是加快系统对数据的访问速度。普通索引允许在定义索引的列中插入重复值和空值。
    • 唯一索引:唯一索引与普通索引类似,不同的是创建唯一性索引的目的不是为了提高访问速度,而是为了避免数据出现重复。唯一索引列的值必须唯一,允许有空值。如果是组合索引,则列值的组合必须唯一。创建唯一索引通常使用 UNIQUE 关键字。例如在student 表中的 id 字段上建立名为 index_id 的索引CREATE UNIQUE INDEX index_id ON tb_student(id);
    • 主键索引:主键索引就是专门为主键字段创建的索引,也属于索引的一种。主键索引是一种特殊的唯一索引,不允许值重复或者值为空。创建主键索引通常使用 PRIMARY KEY 关键字。不能使用 CREATE INDEX 语句创建主键索引。
    • 空间索引:空间索引是对空间数据类型的字段建立的索引,空间索引主要用于地理空间数据类型 ,很少用到。
    • 全文索引:全文索引主要用来查找文本中的关键字,只能在 CHAR、VARCHAR 或 TEXT 类型的列上创建。在 MySQL 中只有 MyISAM 存储引擎支持全文索引。全文索引允许在索引列中插入重复值和空值。

    索引在实际使用上分为单列索引和多列索引。

    单列索引:单列索引就是索引只包含原表的一个列。在表中的单个字段上创建索引,单列索引只根据该字段进行索引。

    例如在student 表中的 address 字段上建立名为 index_addr 的单列索引,address 字段的数据类型为 VARCHAR(20),索引的数据类型为 CHAR(4)。SQL 语句如下:

    CREATE INDEX index_addr ON student(address(4));
    

    这样,查询时可以只查询 address 字段的前 4 个字符,而不需要全部查询。

    **多列索引也称为复合索引或组合索引。**相对于单列索引来说,组合索引是将原表的多个列共同组成一个索引。

    多列索引是在表的多个字段上创建一个索引。该索引指向创建时对应的多个字段,可以通过这几个字段进行查询。但是,只有查询条件中使用了这些字段中第一个字段时,索引才会被使用。

    下面在 student 表中的 name 和 address 字段上建立名为 index_na 的索引,SQL 语句如下:

    CREATE INDEX index_na ON tb_student(name,address);
    

    该索引创建好了以后,查询条件中必须有 name 字段才能使用索引。

    一个表可以有多个单列索引,但这些索引不是组合索引。一个组合索引实质上为表的查询提供了多个索引,以此来加快查询速度。比如,在一个表中创建了一个组合索引(c1,c2,c3),在实际查询中,系统用来实际加速的索引有三个:单个索引(c1)、双列索引(c1,c2)和多列索引(c1,c2,c3)。

    2.2 索引的查看

    查看索引的语法格式如下:

    SHOW INDEX FROM <表名>
    

    查询结果说明如下:

    参数说明
    Table表示创建索引的数据表名
    Non_unique表示该索引是否是唯一索引。若不是唯一索引,则该列的值为 1;若是唯一索引,则该列的值为 0。
    Key_name表示索引的名称。
    Seq_in_index表示该列在索引中的位置,如果索引是单列的,则该列的值为 1;如果索引是组合索引,则该列的值为每列在索引定义中的顺序。
    Column_name表示定义索引的列字段。
    Collation表示列以何种顺序存储在索引中。在 MySQL 中,升序显示值“A”(升序),若显示为 NULL,则表示无分类。
    Cardinality索引中唯一值数目的估计值。基数根据被存储为整数的统计数据计数,所以即使对于小型表,该值也没有必要是精确的。基数越大,当进行联合时,MySQL 使用该索引的机会就越大。
    Sub_part表示列中被编入索引的字符的数量。若列只是部分被编入索引,则该列的值为被编入索引的字符的数目;若整列被编入索引,则该列的值为 NULL。
    Packed指示关键字如何被压缩。若没有被压缩,值为 NULL。
    Null用于显示索引列中是否包含 NULL。若列含有 NULL,该列的值为 YES。若没有,则该列的值为 NO。
    Index_type显示索引使用的类型和方法(BTREE、FULLTEXT、HASH、RTREE)。
    Comment显示评注。

    2.3 索引的创建

    创建索引有3种方式:

    1、CREATE INDEX直接创建:

    可以使用专门用于创建索引的 CREATE INDEX 语句在一个已有的表上创建索引,但该语句不能创建主键。

    CREATE <索引名> ON <表名> (<列名> [<长度>] [ ASC | DESC])
    

    语法说明如下:

    • <索引名>:指定索引名。一个表可以创建多个索引,但每个索引在该表中的名称是唯一的。
    • <表名>:指定要创建索引的表名。
    • <列名>:指定要创建索引的列名。通常可以考虑将查询语句中在 JOIN 子句和 WHERE 子句里经常出现的列作为索引列。
    • <长度>:可选项。指定使用列前的 length 个字符来创建索引。使用列的一部分创建索引有利于减小索引文件的大小,节省索引列所占的空间。在某些情况下,只能对列的前缀进行索引。索引列的长度有一个最大上限 255 个字节(MyISAM 和 InnoDB 表的最大上限为 1000 个字节),如果索引列的长度超过了这个上限,就只能用列的前缀进行索引。另外,BLOB 或 TEXT 类型的列也必须使用前缀索引。
    • ASC|DESC:可选项。ASC指定索引按照升序来排列,DESC指定索引按照降序来排列,默认为ASC。

    例如,在studentname字段上创建索引:

    • 普通索引:CREATE INDEX index_name ON student (name)
    • 唯一索引:CREATE UNIQUE index_name ON student (name)

    创建普通索引使用的关键字,例如在studentname字段上创建一个普通索引index_name

    • 建表创建:CREATE TABLE student(id INT NOT NULL,name CHAR(45) DEFAULT NULL,INDEX(name));
    • ALTER TABLEALTER student ADD INDEX index_name (name)

    2、 CREATE TABLE时创建

    索引也可以在创建表(CREATE TABLE)的同时创建。在 CREATE TABLE 语句中添加以下语句。例如创建student表时在name字段添加索引:

    • 主键索引:CREATE TABLE student(name CHAR(45) PRIMARY KEY);
    • 唯一索引:CREATE TABLE student(id INT NOT NULL,name CHAR(45) DEFAULT NULL,UNIQUE INDEX(name));
    • 普通索引:CREATE TABLE student(id INT NOT NULL,name CHAR(45) DEFAULT NULL,INDEX(name));

    3、 ALTER TABLE时创建

    ALTER TABLE 语句也可以在一个已有的表上创建索引。例如在studentname字段上创建一个普通索引index_name

    • 主键索引:ALTER TABLE student ADD PRIMARY KEY (name);
    • 唯一索引:ALTER TABLE student ADD UNIQUE INDEX index_name(name);
    • 普通索引:ALTER TABLE student ADD INDEX index_name(name);

    2.4 索引失效场景

    创建了索引并不意味着高枕无忧,在很多场景下,索引会失效。下面列举了一些导致索引失效的情形,是我们写SQL语句时应尽量避免的。

    1、条件字段原因

    • 单字段有索引,WHERE条件使用多字段(含带索引的字段),例如 SELECT * FROM student WHERE name ='张三' AND addr = '北京市'语句,如果name有索引而addr没索引,那么SQL语句不会使用索引。
    • 多字段索引,违反最佳左前缀原则。例如,student表如果建立了(name,addr,age)这样的索引,WHERE后的第一个查询条件一定要是name,索引才会生效。

    2、<>、NOT、in、not exists

    当查询条件为等值或范围查询时,索引可以根据查询条件去找对应的条目。否则,索引定位困难(结合我们查字典的例子去理解),执行计划此时可能更倾向于全表扫描,这类的查询条件有:<>、NOT、in、not exists

    3、查询条件中使用OR

    如果条件中有or,即使其中有条件带索引也不会使用(因此SQL语句中要尽量避免使用OR)。要想使用OR,又想让索引生效,只能将OR条件中的每个列都加上索引。

    4、查询条件使用LIKE通配符

    SQL语句中,使用后置通配符会走索引,例如查询姓张的学生(SELECT * FROM student WHERE name LIKE '张%'),而前置通配符(SELECT * FROM student WHERE name LIKE '%东')会导致索引失效而进行全表扫描。

    5、索引列上做操作(计算,函数,(自动或者手动)类型装换)

    有以下几种例子:

    • 在索引列上使用函数:例如select * from student where upper(name)='ZHANGFEI';会导致索引失效,而select * from student where name=upper('ZHANGFEI');是会使用索引的。
    • 在索引列上计算:例如select * from student where age-1=17;

    6、在索引列上使用mysql的内置函数,索引失效

    例如,SELECT * FROM student WHERE create_time

    7、索引列数据类型不匹配

    例如,如果age字段有索引且类型为字符串(一般不会这么定义,此处只是举例)但条件值为非字符串,索引失效,例如SELECT * FROM student WHERE age=18会导致索引失效。

    8、索引列使用IS NOT NULL或者IS NULL可能会导致无法使用索引

    B-tree索引IS NULL不会使用索引,IS NOT NULL会使用,位图索引IS NULLIS NOT NULL都会使用索引。

    最后,对索引的使用做一个总结吧:

    1. 索引有利于查询,但不能随意加索引,因为索引不仅会占空间,而且需要在写库时进行维护。
    2. 如果多个字段常常需要一起查询,那么在这几个字段上建立联合索引是个好办法,同时注意最左匹配原则。
    3. 不要在重复度很高的字段上加索引,例如性别。
    4. 避免查询语句导致索引失效,哪些情况会导致索引失效请见前文。

    劝君莫做白嫖党!欢迎关注❤️、评论📝、点赞👍!

    展开全文
  • MySQL索引及常见面试题

    千次阅读 2022-01-19 09:33:44
    索引(Index)是帮助 MySQL 高效获取数据的数据结构,是对表中一列或多列值进行排序的结构。 就比如索引是一本书的目录,可以通过目录快速查找自己想要查询的东西。 二、索引为什么使用B+树? 先看一下常见的索引...
  • MySQL索引优化总结

    千次阅读 2021-09-29 23:17:15
    前言:相信大家都知道索引可以大大提高MySQL的检索速度,但是真正在平时工作中写SQL,真的会考虑到这条SQL如何能够用上索引提升执行效率?本篇博客详细的介绍了索引优化的20个原则,只要在工作中能够随时应用到,...
  • MySQL索引常见面试题(2022版)

    千次阅读 2022-06-02 17:26:33
    2022年 MySQL常见索引面试题,不仅仅告诉你答案是什么,还告诉你为什么是这样的, 让你的学习不仅仅停留在记忆阶段;你将学习到以下知识: ...MySQL索引失效的几种情况?常见的索引优化手段有哪些? ............
  • 一文搞懂MySQL索引(清晰明了)

    万次阅读 多人点赞 2021-02-02 17:30:43
    MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。 MySQL中常用的索引结构(索引底层的数据结构)有:B-TREE ,B+TREE ,HASH 等。 MySQL 的索引有两种分类方式:逻辑分类和物理...
  • MySQL索引优化

    千次阅读 多人点赞 2021-02-19 09:42:44
    一、MySQL索引基础 本文主要讨论MySQL索引的部分知识。将会从MySQL索引基础、索引优化实战和数据库索引背后的数据结构三部分相关内容。 一、MySQL索引基础 首先,我们将从索引基础开始介绍一下什么是索引,分析...
  • MySQL 索引结构

    万次阅读 多人点赞 2021-05-26 20:42:33
    在上一篇 MySQL 索引类型 中,我们已经了解了索引的基本概念以及分类,那么,索引的结构是什么样的?为什么索引可以这么快?这一篇文章将继续探讨索引的实现原理和数据结构。 文章目录前言索引数据结构二叉树的局限...
  • 原来Mysql索引要这么设计才能起飞

    千次阅读 多人点赞 2022-05-29 22:59:33
    本文总结了10个实用Mysql索引设计原则,相信在大家进行索引设计的时候可以进行参考。 索引设计原则 我们在数据库表设计好之后,先不要着急马上就进行表的索引设计,因为这个时候其实你也并不清楚未来在这个表上...
  • 一文整理14道MySQL索引相关面试题

    千次阅读 2022-01-05 18:51:24
    精心整理14道MySQL索引相关面试题(珍藏版) 如果仅仅是死记硬背MySQL索引相关面试题一定是相当枯燥的,不容易记却容易忘,这里循序渐进的讲解有关索引有关知识点,让大家在理解的基础上记住一些面试常问的点。 ...
  • Mysql索引

    万次阅读 2022-06-15 09:02:14
    索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。
  • mysql 索引原理详解

    千次阅读 2021-01-24 13:06:58
    前言 在mysql的性能优化中,索引优化...mysql索引的目的也是在此,数据可以以一定的物理结构存储到磁盘上,但是检索的时候,如果直接查找必然会消耗大量的时间在其他方面,而有了索引,配合合理的存储结构,就可以大大
  • MySQL索引的使用实例

    千次阅读 多人点赞 2020-10-24 13:11:43
    MySQL索引的使用实例一. 慢查询日志二. 查询分析器——explain三. 索引的基本使用四. 复合索引五. 覆盖索引 一. 慢查询日志 //查看是否开启慢查询日志 mysql> show variables like '%slow%'; //临时开启慢查询...
  • MYSQL 索引类型

    千次阅读 多人点赞 2021-02-18 12:29:44
    一、索引类型 在数据库表中,对字段建立索引可以大大提高查询速度。假如我们创建了一个 mytable表 代码如下: CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL ); 我们随机向里面插入了10000...
  • MySQL索引的概念以及七种索引类型介绍。
  • 面试官:听说你精通MySQL,那来和我大战三百个回合吧!
  • MySQL索引-知识点总结

    千次阅读 2022-03-13 10:34:16
    MySQL索引-知识点总结1.什么是索引2.索引的使用3.索引底层的数据结构 ·> MySQL 作为一个数据存储的工具,最基本的就是 MySQL 的基础使用,我们首先要会使用这个工具,会写 SQL 语句,懂得 MySQL 存储数据和 SQL...
  • Mysql 索引存放位置

    千次阅读 2021-08-07 14:52:35
    可以通过SHOW VARIABLES LIKE '%datadir%'查询mysql索引存放位置: 根据存储引擎不同,索引的文件类型也不同:
  • 修改Mysql索引长度限制

    千次阅读 2021-01-19 02:29:37
    mysql 索引过长1071-max key length is 767 byte问题create table: Specified key was too long; max key length is 767 bytes原因数据库表采用utf8编码,其中varchar(255)的column进行了唯一键索引mysql默认情况...
  • MySQL索引面试题汇总

    千次阅读 多人点赞 2021-03-07 14:25:01
    2.索引数据结构分类 3.二叉查找树 4.红黑树(自平衡二叉查找树) 5.B-Tree 6.B+Tree 6.1 B+Tree概述及特点 6.2B+Tree存放数据示例 6.3 MyISAM存储引擎索引实现 6.4InnoDB底层存储引擎索引实现 7.索引...
  • 什么是MySQL索引

    千次阅读 2022-02-21 22:48:04
    全网最全面的mysql索引总结!!!
  • MySQL索引为什么能提高查询速度

    千次阅读 2022-04-16 19:03:10
    MySQL索引为什么能更快 文章目录MySQL索引为什么能更快前言一、什么是索引?二、索引解读总结 前言 提示:这里可以添加本文要记录的大概内容: MySQL在高数据量查询的情况下要求必须使用索引,那么为什么一定...
  • MYSQL索引下推

    千次阅读 2021-12-30 10:45:07
    索引下推,全程,索引条件下推(Index Condition Pushdown)简称ICP。...正常情况(MYSQL5.6之前),这条sql根据最左前缀匹配原则,name会走索引,age和position不一定会走索引。name是like模糊匹配,age和postio
  • MySql索引总结

    千次阅读 2021-01-25 12:47:17
    索引概念B+树索引分为聚集索引和非聚集索引(辅助索引),但是两者的数据结构都和B+树一样,区别是存放的内容。可以说数据库必须有索引,没有索引则检索过程变成了顺序查找,O(n)的时间复杂度几乎是不能忍受的。我们...
  • mysql索引在什么位置

    千次阅读 2021-01-20 04:02:13
    MySQL索引的简介在MySQL中,索引(index)也叫做“键(key)”,它是存储引擎用于快速找到记录的一种数据结构。索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对性能的影响就愈发重要。索引优化...
  • 如何查看mysql索引

    千次阅读 2020-09-25 10:03:54
    如果MySQL索引不能包括重复词,则为0。如果可以,则为1。 · Key_name 索引的名称。 · Seq_in_index 索引中的列序列号,从1开始。 · Column_name 列名称。 · Collation 列以什么方式存储在索引中。在MySQL中,有...
  • 什么是 MySQL 索引?

    万次阅读 多人点赞 2020-03-25 11:26:06
    什么是索引?假设我们有一张数据表 employee(员工表),该表有三个字段(列),分别是name、age 和address。假设表employee有...
  • Mysql索引在什么情况下会失效?

    千次阅读 2022-03-16 14:50:59
    3、使用%XXX左模糊查询,因为mysql是最左原则,使用XXX%右模糊查询是可以使用索引的,但是左模糊违背了最左原则所以不行 4、使用范围运算,not in,in > ,<都不行 5、查询的字段不是索引的最左字段,同样是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 569,559
精华内容 227,823
关键字:

mysql索引

mysql 订阅
友情链接: vMixDesktopCaptureNDI.zip