织梦末班和dw建设网站哪个方便优化,wordpress安装百度统计,网站视频站建设教程和,建筑工程人才招聘网我们经常说到mysql优化#xff0c;优化中一种常见的方式就是对于经常查询的字段创建索引。那么mysql中有哪些索引类型呢#xff1f; 一、索引分类1、普通索引#xff1a;即一个索引只包含单个列#xff0c;一个表可以有多个单列索引 2、唯一索引#xff1a;索引列的值必须… 我们经常说到mysql优化优化中一种常见的方式就是对于经常查询的字段创建索引。那么mysql中有哪些索引类型呢 一、索引分类1、普通索引即一个索引只包含单个列一个表可以有多个单列索引 2、唯一索引索引列的值必须唯一但允许有空值 3、复合索引即一个索引包含多个列 4、聚簇索引(聚集索引)并不是一种单独的索引类型而是一种数据存储方式。具体细节取决于不同的实现InnoDB的聚簇索引其实就是在同一个结构中保存了B-Tree索引(技术上来说是BTree)和数据行。 5、非聚簇索引不是聚簇索引就是非聚簇索引 二、基本语法 查看索引 SHOW INDEX FROM table_name 创建索引CREATE [UNIQUE ] INDEX indexName ON mytable(columnname(length));ALTER TABLE 表名 ADD [UNIQUE ] INDEX [indexName] ON (columnname(length)) 删除索引DROP INDEX [indexName] ON mytable; 上面讲了创建索引的基本语法现在处理讲一下如何查看执行计划。 执行计划使用EXPLAIN关键字可以模拟优化器执行SQL查询语句从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是表结构的性能瓶颈 执行计划的作用1、表的读取顺序2、数据读取操作的操作类型/ 3、哪些索引可以使用哪些索引被实际使用 4、表之间的引用 5 、每张表有多少行被优化器查询 执行计划包含的信息有 执行计划-ID select查询的序列号,包含一组数字表示查询中执行select子句或操作表的顺序 有三种情况1、id相同执行顺序由上至下2、id不同如果是子查询id的序号会递增id值越大优先级越高越先被执行3、id相同不同同时存在 执行计划-select_type查询的类型主要是用于区别普通查询、联合查询、子查询等的复杂查询 执行计划-typetype显示的是访问类型是较为重要的一个指标结果值从最好到最坏依次是 system const eq_ref ref fulltext ref_or_null index_merge unique_subquery index_subquery range index ALL 常见的为 systemconsteq_refrefrangeindexALL system表只有一行记录等于系统表这是const类型的特列平时不会出现这个也可以忽略不计 const表示通过索引一次就找到了const用于比较primary key或者unique索引。因为只匹配一行数据所以很快如将主键置于where列表中MySQL就能将该查询转换为一个常量 eq_ref唯一性索引扫描对于每个索引键表中只有一条记录与之匹配。常见于主键或唯一索引扫描 range只检索给定范围的行,使用一个索引来选择行。key 列显示使用了哪个索引一般就是在你的where语句中出现了between、、、in等的查询 这种范围扫描索引扫描比全表扫描要好因为它只需要开始于索引的某一点而结束语另一点不用扫描全部索引。 allFull Table Scan将遍历全表以找到匹配的行 执行计划-possible_keys 实际使用的索引。如果为NULL则没有使用索引查询中若使用了覆盖索引则该索引和查询的select字段重叠 执行计划-key_len 表示索引中使用的字节数可通过该列计算查询中使用的索引的长度。在不损失精确性的情况下长度越短越好 key_len显示的值为索引字段的最大可能长度并非实际使用长度即key_len是根据表定义计算而得不是通过表内检索出的 根据这个值就可以判断索引使用情况特别是在组合索引的时候判断所有的索引字段是否都被查询用到。 char和varchar跟字符编码也有密切的联系, latin1占用1个字节gbk占用2个字节utf8占用3个字节。不同字符编码占用的存储空间不同 字符类型索引字段为char 不为 null: 字符类型索引字段为char 允许为 null: 索引字段为varchar类型不可为Null时 索引字段为varchar类型允许为Null时 整数/浮点数/时间类型的索引长度 NOT NULL字段本身的字段长度NULL字段本身的字段长度1(因为需要有是否为空的标记这个标记需要占用1个字节) datetime类型在5.6中字段长度是5个字节datetime类型在5.5中字段长度是8个字节 key_len 总结变长字段需要额外的2个字节VARCHAR值保存时只保存需要的字符数另加一个字节来记录长度(如果列声明的长度超过255则使用两个字节)所以VARCAHR索引长度计算时候要加2固定长度字段不需要额外的字节。 而NULL都需要1个字节的额外空间,所以索引字段最好不要为NULL因为NULL让统计更加复杂并且需要额外的存储空间。 复合索引有最左前缀的特性如果复合索引能全部使用上则是复合索引字段的索引长度之和这也可以用来判定复合索引是否部分使用还是全部使用。 执行计划-ref 显示索引的哪一列被使用了如果可能的话是一个常数。哪些列或常量被用于查找索引列上的值 执行计划-rows根据表统计信息及索引选用情况大致估算出找到所需的记录所需要读取的行数 执行计划-Extra包含不适合在其他列中显示但十分重要的额外信息 Using filesort 说明mysql会对数据使用一个外部的索引排序而不是按照表内的索引顺序进行读取。MySQL中无法利用索引完成的排序操作称为“文件排序”Using temporary使了用临时表保存中间结果,MySQL在对查询结果排序时使用临时表。常见于排序 order by 和分组查询 group by USING index 表示相应的select操作中使用了覆盖索引(Covering Index)避免访问了表的数据行效率不错如果同时出现using where表明索引被用来执行索引键值的查找 如果没有同时出现using where表明索引用来读取数据而非执行查找动作 转载于:https://www.cnblogs.com/cheng21553516/p/11403378.html