索引: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,这就要看是先过滤再排序划算,仍是先排序再过滤划算。