索引
1.创建索引
CREATE INDEX方式,用于创建表的时候
普通的索引的创建:
CREATE INDEX (自定义)索引名 ON 数据表(字段);
复合索引的创建:
CREATE INDEX (自定义)索引名 ON 数据表(字段,字段....);
ALTER TABLE方式,用于建表完成后添加索引
//普通索引
alter table (表名) add index index_name (字段,字段....) ;
//唯一索引
alter table (表名) add unique (字段,字段....) ;
//主键索引
alter table (表名) add primary key (字段,字段....) ;
//全文索引
ALTER TABLE (表名) ADD FULLTEXT (字段,字段....) ;
//主键索引
ALTER TABLE (表名) ADD INDEX index_name (字段,字段....) ;
2查看是否有索引
在查询条件前使用EXPLAIN命令可以查看SQL的执行计划,如果是NULL,说明无索引。
3.一条SQL语句执行得很慢的原因有哪些?
①大多数情况下很正常,偶尔很慢
1、数据库在刷新脏页,例如 redo log 写满了需要同步到磁盘。
2、执行的时候,遇到锁,如表锁、行锁。
②这条 SQL 语句一直执行的很慢(索引失效,或者没有索引,数据库选择不走索引)
- like 以%开头,索引无效;当like前缀没有%,后缀有%时,索引有效。
- or语句前后没有同时使用索引。当or左右查询字段只有一个是索引,该索引失效,只有当or左右查询字段均为索引时,才会生效
- 组合索引,不是使用第一列索引,索引失效。
- 数据类型出现隐式转化。如varchar不加单引号的话可能会自动转换为int型,使索引无效,产生全表扫描。
- 在索引字段上使用not,<>,!=。不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描。 优化方法: key<>0 改为 key>0 or key<0。
- 对索引字段进行计算操作、字段上使用函数(即是在左边做了运算)。(索引为 emp(ename,empno,sal))。
- 当全表扫描速度比索引速度快时,mysql会使用全表扫描,此时索引失效。(主键索引和非主键索引是有区别的,主键索引存放的值是整行字段的数据,而非主键索引上存放的值不是整行字段的数据,而且存放主键字段的值。
也就是说,我们如果走 非主键索引这个字段的索引的话,最后会查询到对应主键的值,然后,再根据主键的值走主键索引,查询到整行数据返回。所以说走全表查询要查询n行,那索引就是2n,如果n很大,这个时候2n >>n,数据库就会放弃索引走全表查询)
4.聚集索引
所谓聚集索引,就是data域存放着数据,主键索引就属于聚集索引。
5.非聚集索引
非聚集索引是data存放着主键或数据的指针,二级索引就属于非聚集索引。
6.索引覆盖
如果我们要查询的字段恰好建立了索引,那就不用“回表”再根据主键查一遍,直接返回值
例如:select name from table_a where name=‘zrx’;;这时候我们恰好有为name字段建立索引,我们就能得到name的值(因为索引的key本身就是name啊),系统难道还会去根据主键回表再查一遍吗?答案是肯定不会的。
同样地,
例如:select id from table_a where id=‘10086’;这查询也会出现索引覆盖,因为主键索引的key同样是id,数据库就不会再去回表查询一遍了。
这个覆盖索引有点奇奇怪怪啊,根据一个已经知道的值再查一遍。不过我猜想还是有作用的,应该在像右模糊查询这种情况下。
7.哪些字段适合作为索引
1.查询频繁,修改不频繁
2.经常作为条件查询的
8.B+树
如果不想了解的太透彻,但是又想快速理解。我们不妨这样想,从名字我们就可以知道这个结构就是树,树的话,我们学后端的就知道保存在树的数据都是排序的,所以,我们不难的出结论。树的key是有序的而已有一个区间,越往下区间越小,最终定位到需要的数据。