mysql索引知识点总结

时间:2021-05-08 00:46:15

  说起提高数据库性能,索引是最物美价廉的东西了。不用加内存,不用改程序,不用调sql,只要执行个正确的’create index’,查询速度就可能提高百倍千倍,这可真有诱惑力。可是天下没有免费的午餐,查询速度的提高是以插入、更新、删除的速度为代价的,这些写操作,增加了大量的I/O

1、什么是索引?

答:索引是针对数据库中的数据所建立的目录。

 

2.使用索引的好处与坏处?

答:好处:大大加快了查询的速度

      坏处:降低了增、删、改的速度,增大了磁盘资源的消耗(索引文件甚至可能比数据文件还大)。

 

3.索引的使用原则?

答:1.不过度使用索引

       2. 较频繁的作为查询条件的字段应该添加索引

       3. 数据分布比较离散的字段适合添加索引,数据分布比较集中的字段不适合添加索引(如性别)

       4. 更新非常频繁的字段不适合添加索引.

       5. 不会出现在where子句中的字段不适合添加索引。

 

4.根据索引的对象,索引可分为哪几种?

答:普通索引(index)、唯一索引(unique)、主键索引(primary key)、全文索引(fulltext)。

 

5.根据索引的数据结构,索引可分为哪几种?

答: hash索引,BTree索引。

 

6. Hash索引和BTree索引依赖的存储引擎是什么?

答:BTree索引依赖的存储引擎是myisaminnodbHash索引依赖的引擎是memory

 

7. BTree索引依赖的存储银枪是myisaminnodb,有什么区别吗?

答:使用MyISAM引擎,一张表对应三张保存文件(结构文件、数据文件、索引文件),也就是说使用myisam引擎,数据文件和索引文件是分开的,我们称之为非聚集索引。

  使用innodb引擎,一张表对应一张保存文件,也就是说使用innodb引擎,数据文件和索引文件是绑定在一起的,我们称之为聚集索引。

 

8. hash索引和BTree索引的时间复杂度是多少?

答:BTree索引的时间复杂度为O(log2N)Hash索引的时间复杂度理论上为O(1)

 

9. 为什么说Hash索引的时间复杂度理论上为O(1)呢?

答:所谓Hash索引,当我们要给某张表某列增加索引时,将这张表的这一列进行哈希算法计算,得到哈希值,排序在哈希数组上。所以Hash索引理论上可以一次定位,其效率很高。之所以说它是理论上,是因为计算出的哈希值可能重复,如果哈希值重复,就没有办法一次准确定位,甚至当哈希值大量重复且数据量特别大时,哈希索引效率会没有BTree索引的效率高。

 

10. Hash索引的底层数据结构是什么?

答:数组+链表。类似于Hashmap的底层。

 

11. BTree索引的底层数据结构是什么?

答:B+TreeB+树是一个平衡的多叉树,从根节点到每个叶子节点的高度差值不超过1,而且同层级的节点间有指针相互链接。在B+树上的常规检索,从根节点到叶子节点的搜索效率基本相当,不会出现大幅波动,而且基于索引的顺序扫描时,也可以利用双向指针快速左右移动,效率非常高。

 

12. Hash索引的缺点有哪些?

答:Hash索引仅仅能满足等于索引,不能进行范围索引。

       Hash索引无法被用来避免数据的排序操作。

       Hash索引不能利用部分索引键查询。

       Hash索引遇到大量哈希值重复的问题时,查询效率并一定比BTree索引高。

 

  实际中,我们不用Hash索引,Hash索引依赖的引擎是memory,但现在mysql最常使用的引擎是myisaminnodb,甚至越来越只倾向于innodb,默认即为innodb,而innodb只支持BTree索引。所以,我们用BTree索引。

 

13. 常见的操作索引的命令有哪些?(BTree索引)

答:(这里不全,用到去查)

        查看一张表上所有索引

        show index from 表名

 

        添加索引

        alter table 表名 add index/unique/fulltext [索引名] (列名);

        alter table 表名 add primary key (列名);//不要加索引名,因为主键只有一个

 

        删除索引

  删除非主键索引:alter table 表名 drop index 索引名;

  删除主键索引:alter table 表名 drop primary key;

 

例子:

创建一张表member

create table member(

id int,

email varchar(30),

tel varchar(20),

intro text

) engine myisam set character utf8;

 

tel字段加一个普通索引

alter table member add index tel (tel);

 

email字段加一个唯一索引

alter table member add unique (email);

 

intro字段加一个全文索引

alter table member add fulltext (intro);

 

id字段加一个主键索引

alter table member add primary key (id);

 

删掉intro索引

Alter table member drop index intro;

 

删掉tel索引

Alter table member drop index tel;

 

删掉email索引

Alter table member drop index email;

 

删掉主键索引

Alter table member drop primary key;

 

14. 全文检索的命令用法

答:match(全文索引名) against (keyword);

 

15. 关于全文索引的停止词

答:全文索引不会针对非常频繁的词创建索引,如this,is,you,my等,这种次叫停止词。

 

16. 为什么mysql中的全文检索在默认情况下,对于中文的意义不大?

答:mysql中的全文检索是针对英文的,因为英文都通过空格或标点符号将一个个的单词拆开来了,方便对英文单词进行全文索引;而对于中文,mysql无法有效地区分中文单词,所以无法做全文检索。

 

17. 案例:设有新闻表15列,10列上由索引,共500W行数据,如何快速导入?

答:1把空表的索引全部删除

       (2)导入数据

       (3)数据导入完毕后,集中建索引