Mysql 索引创建

在创建表的时候创建索引

CREATE TABLE ind1 (
    id int primary key,
    name char(12),
    index ind_name(name)
);

在建表之后添加索引

CREATE TABLE ind2 (
    id int primary key,
    email char(12)
);
CREATE INDEX ind_email on ind2(email);
alter table ind2 add index ind_email(email);

删除索引

drop index ind_email on ind2;
索引的基础用法
你设置了哪个字段为索引,那么查找条件就使用这个字段,就能够加速查询
如果我们给id字段创建了索引,但是查找的确实email条件,那么就未命中索引,并不会加速查询
一次sql查询只能用上一个索引id = 1000 and email='eva1000@oldboy'

索引的正确使用
1.如果查询的结果是很多条数据的话我们仍然不能命中索引
> < >= <= != like between and
2.当我们选定某一列作为索引的时候,这一列必须是区分度比较高的列
如果这一列的内容都是重复的,那么创建了索引也不会有任何的加速效果
3.索引列不能在条件中参与计算
4.对于sql中的or来说,即便找到一个为假的条件也还是要去判断另外的条件是否成立,所以mysql并没有进行优化
所有的查询都是从左向右一次进行的,所以使用了or的条件语句很难命中索引
对于sql中的and,由于只要找到一个为假的条件就可以放弃判断整个语句,所以mysql进行了优化
在所有的and条件中会找到第一个区分度最高的列来使用它的索引,来达到加快查询速度的效果
5.联合索引 :最左前缀匹配原则
create index union_ind on s1(id,email,name)
联合索引,第一个索引项是这个索引的姓,每一次查询条件必须带着第一个索引项字段(例id),才能命中联合索引
如果条件中丢失了第一个索引项来创建条件,那么不能命中联合索引
create index union_ind on s1(id,email,name,sex)
id
email,id
id,email,name
id,email,name,sex
id,name
id,sex
id,name,sex

explain和覆盖索引 甚至和索引都没有任何关系
它只是在真正使用某一条sql语句之前先来看一看这条语句计划中是怎么执行的

覆盖索引(好事儿)
是你能够从辅助索引中直接拿到想要的数据,而不需要再经过IO从聚集索引中取值了

可以在配置中开启慢日志,把所有的sql语句执行的超过了你预期时间的都记录下来,方便我们查看具体慢的sql语句,来进行修改和优化

聚集索引 直接把数据存储在建立好了的索引中
非聚集索引(辅助索引) name,sex 只有索引字段存储在索引中,该字段所在行的其他数据存储在另外的地址,在辅助索引的叶子节点上有一个指针指向这行数据所在的地址
select name where name like 'eva';
select name,sex where name like 'eva';

age创建一个索引
select age where age > 60; 覆盖索引
select age,name where age > 60; 不是覆盖索引

age,name创建一个联合索引
select age,name where age > 60; 覆盖索引
posted @ 2019-04-25 18:00  __Invoker  阅读(153)  评论(0编辑  收藏  举报