索引

作用:
1.约束
-主键
-外键
-唯一
-普通
-组合
......
2.加速查找************
为什么所以可以这么快:
例如:name列建立索引
创建一个文件,name列所有数据拿出来,制作成一个B-TREE
左侧小于根,右侧大于根
name = 'liqilong' ==> 6
30
10 40
5 15 35 66
1 6 11 19 21 39 55 100
先在B-TREE中查找到数据的位置,然后根据位置查找数据

索引种类:
普通索引 - 加速查找
唯一索引 - 加速查找+约束列数据不能重复
主键索引 - 加速查找+约束列数据不能重复+不能为null
组合索引 - (多列可以创建一个索引文件)联合唯一+加速查找+约束列数据不能重复+不能为null

索引代价:
由于建立的时候有多个文件,所以插入,更新,删除会变慢。

索引应用场景:
频繁查找

索引增删改查:
1.创建普通索引:
create index 索引名 on 表(列名)

添加索引:
alter table 表名 add index 索引名(列名)

创建表的时候直接指定:
create table 表名(
...
index 索引名 (列名)
);

查看索引:
show index from 表名

删除索引:
drop index 索引名 on 表名
2.创建唯一索引:
create unique index 索引名 on 表(列名)

添加索引:
alter table 表名 add unique 索引名(列名)

创建表的时候直接指定:
create table 表名(
...
unique 索引名 (列名)
);
3.创建主键索引:
建表的时候指定主键,就是主键索引
4.创建组合索引:
- 普通索引组合
无约束
- 联合唯一索引
有约束
查找:最左匹配|最左前缀(查找的时候如果从组合的最左边开始查找,会走索引,否则不走索引)


======扩展=========
覆盖索引:
select * from tb where nid=1
# 先去索引中找
# 再去数据表找

select nid from tb where nid=1
# 只需要再索引表中找,我们把这种模式叫做覆盖索引

合并索引:
nid name(单独索引) email(单独索引) pwd

select * from tb where name='lql'
select * from tb where email='123@163.com'
select * from tb where name='lql' or email='123@163.com'
两个索引合并起来搜索,占用空间

组合索引存在最左匹配的短板

执行计划 - 相对准确表达出当前SQL运行状况
是否走索引

explain SQL语句

1.explain SQL语句
type:ALL - 全数据表扫描
type:index - 全索引表扫描

2.limit
找到就停

-----SQL:ALL、Index 都是有优化的余地 ------
3.range
对索引进行范围查找
注意!= >不可以(主键和数字类型的可以)

4.index_merge
5.ref
6.eq_ref
7.const

如何命中索引:
模糊搜索,%在后面会命中,在前面无法命中
在索引处,别用函数做运算(别转化索引)
数据类型不一致也不会走索引
- 避免使用select *
- count(1)或count(列)代替count(*)
- 创建表是尽量用char代替varchar
- 表的字段顺序固定长度的优先
- 尽量使用短索引(指定前几个字符创建索引)
- 使用连接(JOIN)来代替子查询(Sub-Queries)
- 连表时注意条件和类型一致
- 索引散列值(重复多)不适合建立索引,例如性别

posted on 2018-06-05 09:27  风度翩翩的机器空  阅读(126)  评论(0)    收藏  举报

导航