数据库索引知识

索引

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 语句一直执行的很慢(索引失效,或者没有索引,数据库选择不走索引)

  1. like 以%开头,索引无效;当like前缀没有%,后缀有%时,索引有效。
  2. or语句前后没有同时使用索引。当or左右查询字段只有一个是索引,该索引失效,只有当or左右查询字段均为索引时,才会生效
  3. 组合索引,不是使用第一列索引,索引失效。
  4. 数据类型出现隐式转化。如varchar不加单引号的话可能会自动转换为int型,使索引无效,产生全表扫描。
  5. 在索引字段上使用not,<>,!=。不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描。 优化方法: key<>0 改为 key>0 or key<0。
  6. 对索引字段进行计算操作、字段上使用函数(即是在左边做了运算)。(索引为 emp(ename,empno,sal))。
  7. 当全表扫描速度比索引速度快时,mysql会使用全表扫描,此时索引失效。(主键索引和非主键索引是有区别的,主键索引存放的值是整行字段的数据,而非主键索引上存放的值不是整行字段的数据,而且存放主键字段的值

也就是说,我们如果走 非主键索引这个字段的索引的话,最后会查询到对应主键的值,然后,再根据主键的值走主键索引,查询到整行数据返回。所以说走全表查询要查询n行,那索引就是2n,如果n很大,这个时候2n >>n,数据库就会放弃索引走全表查询)

4.聚集索引

所谓聚集索引,就是data域存放着数据,主键索引就属于聚集索引。

5.非聚集索引

非聚集索引是data存放着主键或数据的指针,二级索引就属于非聚集索引。

6.索引覆盖

如果我们要查询的字段恰好建立了索引,那就不用“回表”再根据主键查一遍,直接返回值

扫描二维码关注公众号,回复: 12827669 查看本文章

例如: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是有序的而已有一个区间,越往下区间越小,最终定位到需要的数据。

猜你喜欢

转载自blog.csdn.net/weixin_43957211/article/details/110441628