快速学习MySQL索引的入门教程

该指标是一些特定的MySQL字段进行排序,如二叉树算法和Hashi算法。Hashi算法是设定值和迅速找到他们根据特征值。最常用的,和MySQL的默认是两个二进制树算法btree索引B树算法,领域,如扫描线20可以不扫描结果保存2 ^ 20的使用得到的,这个博客的后续的实现将是一个特殊的算法,将有一个具体的讨论;

解释优化查询检测

解释可以帮助开发人员分析SQL问题。解释说明MySQL如何使用索引来处理SELECT语句和联接表,这有助于选择更好的索引并编写更优化的查询语句。

使用该方法,在SELECT语句之前添加解释。


从错误的博客中解释选择*;




从SQL分析执行对每个查询在MySQL中,决定是否使用索引或表扫描,如果从博客里falsemysql是执行查询操作中发送SELECT *不会,因为SQL解析器分析之后,MySQL显然不会有任何语句的操作;

例子


MySQL >解释选择` birday `从用户那里` ` `生日` <1990 / 2 / 2;



结果:




编号:1





select_type:简单的查询类型(简单查询、连接查询、子查询)



表:用户——显示哪个表是这行的数据

类型:范围区间指数(在小于1990 / 2 / 2区间的数据),这是一个重要的栏目,显示什么类型的连接使用。从最好到最坏的连接类型的const > >参考eq_ref系统> > > > >全文ref_or_null index_merge unique_subquery index_subquery > > > > index_subquery.in指数范围一般,你必须确保查询至少范围水平,最好是达到参考文献

possible_keys:生日指出指数MySQL可以使用查找表中的行。如果它是空的,没有相关的指标,以提高性能,您可以检查WHERE子句来看看一些字段的引用或现场不适合指数。

关键:生日-一个实际使用的索引。如果NULL,索引不使用。如果它是主要的,使用主键。

key_len:4最长的指数宽度。如果关键是零,长度为零。在不损失精度的情况下,越短越好

常量——显示键使用哪个字段或常量。

Rows: 1 - this number indicates that the number of data MySQL is traversing can be found, and it is inaccurate on InnoDB.

附加:在哪里使用索引——执行状态指令,你可以在这里看到的坏例子是使用临时的和使用的。


select_type

简单的选择(不使用联盟或子查询)
初选退出
第二或之后选择工会中的语句
从属联盟的第二个或后面的SELECT语句依赖于外部查询。
工会结果联盟的结果。
第一个选择在子查询子查询
第一选择相关子查询子查询的查询依赖于外
所导出的导出表的选择(在FROM子句的子查询)


额外类型的详细描述

明显:一旦MySQL找到一行与该行相匹配,它就不再搜索了。
不存在:MySQL优化左连接,一旦找到与左连接标准相匹配的行,它就不再搜索了。
范围检查每个记录(指数图:#):没有找到理想的指标。因此,对于前面表中的每一行组合,使用哪个索引检查MySQL并使用它返回表中的行,这是使用索引最慢的连接之一。
当使用filesort:见此,查询需要optimized.mysql需要采取额外的步骤来找出如何返回的行进行排序,排序的所有行根据连接类型和所有行行指针排序键值和匹配条件的商店。
使用索引数据:从仅使用索引信息的表中返回列数据,而不读取实际操作。当表的所有请求列都是同一索引的一部分时,就会出现这种情况。
当使用临时查看时,查询需要优化。在这里,MySQL需要创建一个临时表来存储结果,通常是按不同的列顺序排列,而不是按组进行。
所使用的WHERE子句使用WHERE子句来限制哪些行与下表匹配或返回给用户。如果不希望返回表中的所有行,而连接类型是全部或索引,则会发生这种情况,或者这将是对具有不同连接类型的查询的解释。
系统表只有一行:系统表。这是常量连接类型的特殊情况。
表中记录的最大值可以匹配查询(索引可以是主索引或唯一索引)。因为只有一行,所以值实际上是一个常数,因为MySQL首先读取值,并将其作为常量。
当eq_ref:是连接,当MySQL查询,它记录了一个记录从表从上表中的每个记录的联盟。当索引用作主键或只有一个键时,它使用所有索引。
参考:是一种连接类型时,只有当查询使用的关键,不是唯一的或主要的,或者是这些类型的部分(例如,使用最左前缀)。每行前面的桌子,所有的记录将从表中读取出来的。这类严重依赖记录是由指数相匹配的越少越好越好的数量
范围:连接类型使用索引返回一个范围内的一行,如在寻找某物时使用>或<
索引:这种连接对前一个表中的每个记录进行了完整的扫描(比所有的记录都要好,因为索引通常小于表数据)+
全部的连接类型:对以前记录的每一条都进行了完全扫描,这通常是不好的,应该尽量避免。
其中,类型:
如果它只是索引,这意味着只检索索引树中的信息,这比扫描整个表要快。
如果它是在哪里使用,您使用的地方限制。
如果不可能的地方不需要在那里,一般是没有发现的。
如果这个信息是使用filesort或使用临时很难显示,其中,订单指数往往无法考虑到,如果按照在确定指标,然后排序,将不可避免地导致使用filesort,首先进行筛选、排序或排序和筛选性价比高,性价比高。


索引

索引类型

(1)独特的唯一索引

不能出现相同的值,并且可以有空值。

(2)指数普通指数

允许显示相同的索引内容

(3)主键主键索引

相同的值是不允许的,和空值是不允许的,一个表只能有一个primary_key指数

(4)全文索引全文索引

三指数是基于列值的发挥作用,但全文索引,在一个词的价值一词,如一篇文章,但是没有什么蛋,因为只有MyISAM和英语的支持,和让人不敢恭维的效率,但要完成需求与Coreseek和xunsearch和三方应用程序

MySQL支持多种数据类型,选择合适的数据类型来存储数据对性能有很大的影响:

(1)较小的数据类型通常更好:较小的数据类型通常需要更少的磁盘空间、内存和CPU缓存,可以更快地处理这些数据。

(2)简单数据类型更好:整数数据比字符便宜,因为字符串比较复杂。在MySQL中,应该使用内置日期和时间数据类型,而不是存储时间的字符串;IP地址用整数类型数据类型存储。

(3)尽可能避免无效:应说明被列为不空,除非你想保存空的。在MySQL,包含空值的列是很难查询优化因为他们使和指数,指数的对比统计,比较复杂。0,你应该使用一个特殊的价值或空字符串而不是空值。

对于任何DBMS,索引是优化中最重要的因素。对于少量的数据,对合适的索引没有很大的影响,但是随着数据量的增加,性能将急剧下降。

如果多个列的索引(组合索引),列的顺序是非常重要的,和MySQL只能有效地找到索引的最左前缀。例如:

假设有一个综合指标it1c1c2(C1,C2),和查询语句SELECT * FROM T1 C1 = 1和C2 = 2可以用索引,查询SELECT * FROM T1 C1 = 1也可以使用索引,查询语句SELECT * FROM T1 C2 = 2不要使用这个指标,因为没有启动柱相结合的指标,那就是,如果你想使用C2栏找到,你必须有C1等于价值。

索引是快速搜索的关键,MySQL索引的建立对于MySQL的高效运行非常重要。

在数据库中的表、索引字段可以大大提高查询速度。如果我们创建了一个表表:


创建表的表(

id不是空的,

用户名不能为空的varchar(16)

);




我们随机插入10000条记录,其中一条是5555,admin。

当寻找用户名为adminSELECT * FROM mytable么= 'admin记录,如果指数一直在建立MySQL用户名,找不到任何记录没有任何扫描,即可以准确地找到。相反,MySQL会扫描所有记录,即查询10000条记录。



创建索引


修改表




添加完成后应用到表中。

修改表添加索引类型(独特、主键、索引的全文,){索引名称}(字段名)


修改表` table_name `添加索引` index_name `(` column_list `)指标名称,不可以;如果不是,当前的索引名称是字段的名称;
修改表` table_name `添加独特的(` column_list `)
修改表` table_name `添加主键(` column_list `)
修改表` table_name `添加全文键(` column_list `)
创建索引




创建索引可以将常用索引或唯一索引添加到表中

-例如,这两个索引只能添加;




创建table_name指数index_name(column_list)
创建唯一索引index_name table_name(column_list)



此外,还可以在构建表时添加它。


创建表(` test1 `
` ID ` SmallInt(5)无符号auto_increment不空-注意的关键指标是下面的,你不必在这里创造它
`用户名` varchar(64)不为空的评论用户名,
`昵称` varchar(50)不为空的评论昵称/名字,
介绍文本,
主键(id),
独特的关键` unique1 `(`用户名`),索引的名字,不,不要为该列的名称相同
关键` 1 `(`昵称`),
全文重点`介绍`(`介绍`)
)auto_increment = 4 = MyISAM引擎默认的字符集utf8评论=用户表的背景;



删除索引


索引` index_name `在` talbe_name `
修改表` table_name `下降指数` index_name `
These two sentences are all equivalent, all of which are the deletion of the index index_name in the table_name;

修改表` table_name `删除主键,删除主键索引,注意关键指标只能以这种方式删除



索引视图


显示字段 G指数;




改变指数

更改一个线程,并删除一个可以重建的线程

创建索引的技术

1。维度高列创建索引

数据列中非重复的值,数字越高,维度越高。

如果表中有8行A、b、c、d、a、b、c、d,则表的维数为4。

要创建一个高维度的列索引,如性别和年龄,年龄的维度高于性别。

性别相似的列不适合索引,因为尺寸太低。

2。在列、上、组、按顺序中使用列的索引

三.为较小的数据列使用索引,这可以使索引文件变小,并且可以在内存中加载更多索引键。

4。使用较长字符串的前缀索引

5、不要创建太多索引。除了增加额外的磁盘空间,它对DML操作的速度有很大的影响,因为它需要每次添加或删除索引新一次。

6。使用复合索引,可以减少文件索引的大小,这比使用多个单索引更好。

复合索引和前缀索引

注意,这两种地址形式是索引技能的名称,而不是索引类型;

组合索引

MySQL单索引和合并索引之间有什么区别

为了比较这两个图像,首先建立一个表:


创建表(` myindex `
` i_testid ` int不空auto_increment,
` vc_name ` varchar(50)不为空,
` vc_city ` varchar(50)不为空,
` i_age ` INT NOT NULL,
` i_schoolid ` INT NOT NULL,
主键(` i_testid `)
);



假设有1000个表中的数据,有5 vc_name =二泉记录分布于7的10000记录8,但组合的城市,年龄和学校是不同的。看看这T-SQL:

选择` i_testid `从` myindex `哪里` vc_name ` = 'erquan'and ` vc_city ` = '郑州'和` i_age ` = 25;关联搜索;

首先考虑构建MySQL单列索引:

指数在vc_name栏目设置。当T-SQL执行MySQL迅速锁定目标,在vc_name =二泉5记录并把它放在一个中间结果集,该结果集,我们首先排除vc_city从郑州纪录。然后我们将记录i_age不等于25。最后,我们唯一的选择符合条件的记录。虽然指数是建立在vc_name,MySQL不会扫描整个表时,查询,提高了效率,但离我们的要求有一定的距离,以同样的方式,对MySQL的单一列索引的效率,这是vc_city和i_age设置,类似。

为了进一步提取MySQL的效率,结合指标应考虑。它是建立vc_name,vc_city,i_age成指数。

修改表` myindex `添加索引` name_city_age `(vc_name(10),vc_city,i_age);

当建筑物的长度是50,vc_name。为什么我们在这里使用10这是我们要讨论的前缀索引,因为一般来说,名字的长度不会超过10,这将加快索引查询,减少索引文件的大小,并提高插入的更新速度。

当T-SQL执行时,MySQL不需要扫描任何记录找到的唯一记录!

如果我们在vc_name建造单个列的索引,vc_city和i_age,让表有3个列的索引,是相同的查询效率,以上指标,答案是完全不同的,远远低于我们的综合指标。虽然有三个指标在这个时候,MySQL只能使用其中的一个,这似乎是最有效的单一列索引,和其他两个不能使用,也就是说,一个全表扫描过程。

建立这样一个综合指数实际上相当于建立一个单独的指数。

vc_name,vc_city,i_age
vc_name,vc_city
vc_name


这三个综合指数!为什么没有结合指标如vc_city,i_age等是最左前缀MySQL综合指数的结果。简单的理解仅仅是从组合开始的左侧。不是所有的查询,包括三列将被用于复合指数,和将使用以下T-SQL:


SELECT * FROM myindex whree vc_name =二泉和郑州vc_city =SELECT * FROM myindex whree




接下来的几个没有使用:


SELECT * FROM myindex whree i_age = 20和vc_city =郑州选择*从myindex whree vc_city =郑州




这是name_city_age(vc_name(10),vc_city,i_age)被从左到右,如果没有左前指数MySQL不执行索引查询

前缀索引

如果索引列长度太长,此列索引将生成大索引文件,这不容易操作。索引前缀索引可以通过前缀索引来控制。它应该控制在一个合适的点,它可以控制在0.31黄金值(大于这个值可以创建)。

select count(不同(左(`标题`,10)))/计数(*)从北极;该值大于0.31可创建不同的表前缀索引,`用户`添加索引重复` uname `(标题(10));前缀索引的SQL,建立10索引的名称,它可以减少索引文件的大小,加快查询速度

什么类型的sql不遵循索引

尽量避免这些索引SQL


选择` SNAME `从`斯图`哪里`年龄` + 10 = 30;没有指标的使用是因为所有索引列参与计算

选择` SNAME `从`斯图`在左(`日期`,4)<1990;不使用索引,因为功能操作使用和原理同上

SELECT * FROM ` houdunwang `哪里` uname `喜欢——指数支持%。

SELECT * FROM ` houdunwang `哪里` uname `像% % 支持没有索引

正则表达式不使用索引,这应该很好理解,为什么很难看到在SQL表达式关键词的原因

-字符串和数字比较不使用索引;
创建表'(' char '(10));
从1中解释选择
从1-非行走索引中解释选择*

SELECT * FROM部门名称= 'xxx'or LOC = 'xx或表45——如果有或在这种情况下,即使有一个指标的条件下,它将不会被使用。换句话说,需要使用的所有字段必须被索引,我们建议你尽量避免使用或关键词尽可能。

如果MySQL估计比使用索引更快地使用全表扫描,则不使用索引。



多表关联中的索引效率


选择` SNAME `从`斯图`在左(`日期`,4)<1990;不使用索引,因为功能操作使用和原理同上
SELECT * FROM ` houdunwang `哪里` uname `喜欢——指数支持%。
SELECT * FROM ` houdunwang `哪里` uname `像% % 支持没有索引





从前面的图中可以看到,所有表的类型是全部,表示一个完整的表索引,即666,并且遍历了总共216个查询。

除了完整表索引的第一个表示(必须与其他表关联)之外,其余的是范围(索引间隔),即遍历查询总数的6 + 1 + 1, 9倍1倍;

因此,我们建议在多表连接表中尽可能少地加入,因为粗心是笛卡尔的恐怖扫描的产物,此外,我们还建议利用左连接,减少发病率。由于使用了连接,第一个表是完全扫描必须的,具有较少的发生率,可以减少扫描次数。

劣势指标

不要盲目创建索引,对频繁列的查询操作创建索引,创建索引会使查询操作变得更加快速,但会减少增加、删除、更新速度,同时因为这些操作对索引文件进行重新排序或更新;

然而,在互联网应用、查询报表比DML语句甚至占到80% ~ 90%大得多,所以不要担心太多。只有导入大数据时,索引才能被删除,并且数据被成批插入。最后,添加索引。