在创建表的时候创建索引
create table 表名(字段1 格式(宽度),
字段2 格式(宽度),
index 索引名(想要成为索引的字段名));
在建表的时候创建索引
1.create table 表名 (字段名 类型 primary key, #主键也可以作为索引值
字段名 类型 (宽度));
2.create index 索引名 on 表名(字段名);
3.alter table 表名 add index 索引名(字段名);
删除索引
drop index 索引名 on 表名;
索引的基本用法
设置那个字段为索引,那么查找条件就是用这个字段,就能够加速查询
索引的正确使用方法
1.如果查询的结果是很多条数据的话我们仍然不能命中索引(> .< . >= . <= . !=(<>) . like . between and)
2.如果我们选定某一列作为索引的时候,这一列必须是区分度比较高的列,如果这一列的内容都是重复的,那么创建了索引也不会有任何的加速效果。
3.索引列不能在条件中参与计算。
4.对于sql中的or来说,即便找到一个为假的条件也还是要去判断另外的条件是否成立,所以mysql并没有进行优化,所以查询都是从左到右依次进行的,所以使用or语句很难命中索引。
对于sql语句中的and来说,由于只要找到一个为假的条件就可以放弃判断整个语句,所以mysql进行了优化,在所有and条件中会找到第一个区分度最高的列来使用它的索引,来达到加快查询速度的效果
5.联合索引:最左前缀匹配原则
create index 索引名 on 表名 (id,email,name)
联合索引,第一个索引项是这个索引的姓,每一次查询条件必须带着一个索引项字段(例id)才能命中联合索引,如果条件中丢失了第一个索引项来创建条件,那么不能命中联合索引。。
create index 索引名 on 表名 (id,email,name,sex)
explain
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; #覆盖索引