时间:2021-07-01 10:21:17 帮助过:3人阅读
2.唯一索引:索引列的所有值都只能出现一次,即必须 唯一,值可以为 空
ALTER TABLE table_name ADD UNIQUE (column_list)
3.普通索引:基本的索引类型,值可以为空,没有唯一性的限制
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 这样的关键字出现,这些是很影响数据库性能的。
MySQL之SQL优化详解(二)
标签:update 索引 where insert 快速 就是 优先 union 种类