学习笔记-mysql_索引

索引:mysql

myisam 和 innodb 存储引擎 只支持 btree 索引sql

memory 和 heap 存储引擎 能够支持 hash 和 btree 索引服务器


索引的分类:ide

1.普通索引和惟一索引性能

2.单列索引和组合索引优化

3.全文索引  (只要myisam 才支持)spa

4.空间索引  (只对空间数据类型的字段创建索引  geometry  point linestring polygon)排序


查看建立表中的索引:索引


show index from table;文档


Table 表的名称。

Non_unique 若是索引不能包括重复词,则为0。若是能够,则为1。

Key_name 索引的名称。

Seq_in_index 索引中的列序列号,从1开始。

Column_name 列名称。

Collation 列以什么方式存储在索引中。在MySQL中,有值‘A’(升序)或NULL(无分类)。

Cardinality 索引中惟一值的数目的估计值。经过运行ANALYZE TABLE或myisamchk -a能够更新。基数根据被存储为整数的统计数据来计数,因此即便对于小型表,该值也没有必要是精确的。基数越大,当进行联合时,MySQL使用该索引的机会就越大。

Sub_part 若是列只是被部分地编入索引,则为被编入索引的字符的数目。若是整列被编入索引,则为NULL。

Packed 指示关键字如何被压缩。若是没有被压缩,则为NULL。

Null 若是列含有NULL,则含有YES。若是没有,则该列含有NO。

Index_type 用过的索引方法(BTREE, FULLTEXT, HASH, RTREE)。

Comment 多种评注。


建立表的时候建立索引


create table table_name [col_name data_type]

[unique|fulltext|spatial][index|key][index_name](col_name[length],...)[asc|desc]


unique fulltext spatial 建立索引  分别表示 惟一索引  全文索引  和空间索引

index与key为同义词,二者做用相同 用来指定建立索引:col_name 为须要建立索引的字段列  index_name 为索引名称 为可选参数

length为可选参数 表示索引的长度(只有字符类型的字段才能指定索引长度)

asc 或 desc 指定升序或者降序的索引值存储


更改表建立索引


alter table table_name add [unique|fulltext|spatial] [index|key]

[index_name](col_name(length),...)[asc|desc]


使用create index 建立索引


create [unique|fulltext|spatial] index [index_name]

on table_name (col_name(length),...) [asc|desc]


删除索引经过alter


alter table table_name drop index index_name;


删除索引使用drop index


drop index index_name on table_name;


explain 语句查看全部是否正在使用索引:


id :select查询的序列号


select_type:select查询的类型,主要是区别普通查询和联合查询、子查询之类的复杂查询。

a.SIMPLE:查询中不包含子查询或者UNION

b.查询中若包含任何复杂的子部分,最外层查询则被标记为:PRIMARY

c.在SELECT或WHERE列表中包含了子查询,该子查询被标记为:SUBQUERY

d.在FROM列表中包含的子查询被标记为:DERIVED(衍生)

e.若第二个SELECT出如今UNION以后,则被标记为UNION;若UNION包含在 FROM子句的子查询中,外层SELECT将被标记为:DERIVED

f.从UNION表获取结果的SELECT被标记为:UNION RESULT


table :输出的行所引用的表。


type :联合查询所使用的类型,表示MySQL在表中找到所需行的方式,又称“访问类型”。

type显示的是访问类型,是较为重要的一个指标,结果值从好到坏依次是: 

system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL ,通常来讲,得保证查询至少达到range级别,最好能达到ref。

ALL: 扫描全表

index: 扫描所有索引树

range: 扫描部分索引,索引范围扫描,对索引的扫描开始于某一点,返回匹配值域的行,常见于between、<、>等的查询

ref: 非惟一性索引扫描,返回匹配某个单独值的全部行。常见于使用非惟一索引即惟一索引的非惟一前缀进行的查找

eq_ref:惟一性索引扫描,对于每一个索引键,表中只有一条记录与之匹配。常见于主键或惟一索引扫描

const, system: 当MySQL对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。如将主键置于where列表中,MySQL就能将该查询转换为一个常量。system是const类型的特例,当查询的表只有一行的状况下, 使用system。

NULL: MySQL在优化过程当中分解语句,执行时甚至不用访问表或索引。


possible_keys:指出MySQL能使用哪一个索引在该表中找到行。查询涉及到的字段上若存在索引,则该索引将被列出,但不必定被查询使用。若是是空的,没有相关的索引。这时要提升性能,可经过检验WHERE子句,看是否引用某些字段,或者检查字段不是适合索引。 


key :显示MySQL实际决定使用的键。若是没有索引被选择,键是NULL。

 

key_len:显示MySQL决定使用的键长度。表示索引中使用的字节数,可经过该列计算查询中使用的索引的长度。若是键是NULL,长度就是NULL。文档提示特别注意这个值能够得出一个多重主键里mysql实际使用了哪一部分。

 注:key_len显示的值为索引字段的最大可能长度,并不是实际使用长度,即key_len是根据表定义计算而得,不是经过表内检索出的。


ref:显示哪一个字段或常数与key一块儿被使用。

 

rows:这个数表示mysql要遍历多少数据才能找到,表示MySQL根据表统计信息及索引选用状况,估算的找到所需的记录所须要读取的行数,在innodb上多是不许确的。

 

Extra:包含不适合在其余列中显示但十分重要的额外信息。

Only index,这意味着信息只用索引树中的信息检索出的,这比扫描整个表要快。 

using where是使用上了where限制,表示MySQL服务器在存储引擎受到记录后进行“后过滤”(Post-filter),若是查询未能使用索引,Using where的做用只是提醒咱们MySQL将用where子句来过滤结果集。

impossible where 表示用不着where,通常就是没查出来啥。 

Using filesort(MySQL中没法利用索引完成的排序操做称为“文件排序”)当咱们试图对一个没有索引的字段进行排序时,就是filesoft。它跟文件没有任何关系,其实是内部的一个快速排序。 

Using temporary(表示MySQL须要使用临时表来存储结果集,常见于排序和分组查询),使用filesort和temporary的话会很吃力,WHERE和ORDER BY的索引常常没法兼顾,若是按照WHERE来肯定索引,那么在ORDER BY时,就必然会引发Using filesort,这就要看是先过滤再排序划算,仍是先排序再过滤划算。

相关文章
相关标签/搜索