搞定mysql数据库索引就是这么简单{思维导图}
为什么索引可以提高查询速度
先从MySQL的基本存储结构开始吧
MySQL的基本存储结构是页(记录存储在一个页中)页):
- 每个数据页可以构成一个双向链表
- 每个数据页中的记录可以构成一个单向链表
- 每个数据页都会为其中存储的记录创建一个页目录。使用主键查找记录时,可以使用二分法快速找到页目录中对应的槽,然后遍历对应槽组中的记录,快速找到指定记录
- 使用其他列(非主键) ) 作为搜索条件:单向链表中的每条记录只能从最小的记录开始遍历。
所以如果我们写一条像 select * from user where indexname = 'xxx' 这样的 SQL 语句,不做任何优化,默认会这样:
- 找到记录所在的页面:需要遍历两次链表查找位置页面
- 从页面中查找匹配的记录:由于不是根据主键查询,所以只能遍历页面的单链表
显然这样的查找会如果数据量很大的话,速度会很慢。 !这个的时间复杂度是O(n)。
使用索引后
索引有什么作用来加快我们的查询速度?其实就是将无序数据转换为有序(相对):
查找 ID 为 8 的记录的简单步骤:
很明显:不使用索引,我们需要去双向链表找到对应的页面,现在您可以通过“目录”快速导航到相关页面! (二分查找,时间复杂度约为O(logn))
其实基本结构就是B+树。 B+树作为一种树的实现,可以让我们快速找到相关记录。
关于索引的其他重要补充
以下内容包括:《Java工程师修炼之道》
最左前缀原则
MySQL中的索引可以按特定顺序引用多个列。这样的索引称为公共索引。例如User表的姓名和城市以及公共索引为(name,city)o。最左前缀原则是指,查询时如果查询条件恰好匹配索引左边的一列或多列连续的列,则可以使用该列。到达。如下:
select * from user where name=xx and city=xx ; //可以命中索引
select * from user where name=xx ; // 可以命中索引
select * from user where city=xx; // 法命中索引
复制代码
这里需要注意的是,如果查询时同时使用了两个条件,但是顺序不同,比如city=xx和name=xx
,当前查询引擎会自动优化And yes 匹配共享索引的顺序,这样可以命中索引。
由于最左前缀原则,在创建普通索引时,索引字段的顺序必须考虑到去重后字段值的数量,较大的放在前面。 ORDERBY 子句也遵循此规则。
注意避免冗余索引
冗余索引是指具有相同功能的索引。如果他们能进球,他们一定会进球。然后这些是冗余索引,例如(名称,城市)和(名称)。这两个索引是多余的。在大多数情况下,尝试扩展现有索引而不是创建新索引。
从MySQLS.7开始,可以通过查询表来查看冗余索引schemal_r dundant_indexes
sys库
Mysql如何为表字段添加索引? ? ?
1。添加PRIMARY KEY(主键索引)
ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` )
复制代码
2。添加独特的
ALTER TABLE `table_name` ADD UNIQUE ( `column` )
复制代码
3。添加INDEX(常规索引)
ALTER TABLE `table_name` ADD INDEX index_name ( `column` )
复制代码
4。添加FULL TEXT(全文索引)
ALTER TABLE `table_name` ADD FULLTEXT ( `column`)
复制代码
5。添加多列索引
ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )
作者:SnailClimb
来源:掘金
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。