目录mysql
是什么: 排好序的快速查找数据结构sql
两个主要的索引结构: B+tree 索引和哈希索引。数据库
如何建: 1. ALTER TABLE table_name ADD INDEX index_name (column_list); 2. CREATE INDEX index_name ON table_name (column_list);缓存
优势: 相似大学图书馆建书目索引,提升了检索效率,下降了数据库IO,同时还能够经过索引进行排序,下降数据排序的成本,下降了CPU的消耗数据结构
缺点: 虽然索引大大提升了查询速度,同时却会下降更新表的速度,如对表进行 insert
、update
和delete
,由于更新表时不只要保存数据,还要保存一下索引文件每次更新添加了索引列的字段。性能
1.主键索引:主键是一种惟一性索引,但它必须指定为PRIMARY KEY
,每一个表只能有一个主键优化
ALTER TABLE table_name ADD PRIMARY KEY (column_list)
2.惟一索引:索引列的全部值都只能出现一次,即必须 惟一,值能够为 空code
ALTER TABLE table_name ADD UNIQUE (column_list)
3.普通索引:基本的索引类型,值能够为空,没有惟一性的限制blog
ALTER TABLE table_name ADD INDEX index_name (column_list);
4.全文索引: 全文索引的索引类型为 FULLTEXT,全文索引只能建立在CHAR、VARCHAR、TEXT类型的字段上。查询数据量较大的字符串类型字段时,使用全文索引能够提升查询速度排序
ALTER TABLE table_name ADD FULLTEXT INDEX index_name(column_list);
对于MySQL的索引建立,咱们常常有疑虑,那么何时该建何时不应建呢?
哪些状况须要建立索引
主键自动建立惟一索引
频繁做为查询条件的字段应该建立索引
查询中与其它表关联的字段,外键关系创建索引
查询中排序的字段,排序字段若经过索引去访问将大大提升排序速度
查询中统计或者分组字段
哪些状况不须要建索引
where
条件用不到的字段不适合建立索引
Explain简称执行计划,使用Explain关键字能够模拟优化器执行SQL查询语句
用法:explain + SQL
① id 相同执行顺序由上至下
② id 不一样,若是是子查询,id的序号会递增,id值越大优先级越高,越先被执行
③ id相同不相同,不相同
注:id若是相同,能够认为是一组,从上往下顺序执行;在全部组中,id值越大,优先级越高,越先执行
select
查询,查询中不包含子查询或者 union
select
或where
列表中包含了子查询from
列表中包含的子查询被标记为 derived(衍生)select
出如今以后,则被标记为 union
(若union
包含from
子句的子查询中,外层select
将被标记为:derived)union
表获取结果的 select
从好到坏,system > const > eq_ref > ref > range > index > all
where
语句中出现了 between、<、>、in等的查询
查询中若使用了覆盖索引,则该索引与查询的select字段重叠
注:由key_len
可知t1
表的idx_col1_col2
被充分使用,col1
匹配t2
表的col1
,col2
匹配了一个常量,即 'ac'
order by
和分组查询 group by
select
操做中使用了覆盖索引(Covering Index),避免访问了表的数据行,效率不错!where
过滤where
子句的值老是false,不能用来获取任何数据
select
操做已经优化到不能再优化了(MySQL根本没有遍历表或索引就返回数据了distinc
关键字心法:
针对explain命令生成的执行计划,这里有一个查看心法。咱们能够先从查询类型type列开始查看,若是出现all关键字,后面的内容就均可以不用看了,表明全表扫描。再看key列,看是否使用了索引,null表明没有使用索引。而后看rows列,该列用来表示在SQL执行过程当中被扫描的行数,该数值越大,意味着须要扫描的行数越多,相应的耗时越长,最后看Extra列,在这列中要观察是否有Using filesort 或者Using temporary 这样的关键字出现,这些是很影响数据库性能的。