说起提高数据库性能,索引是最物美价廉的东西了。不用加内存,不用改程序,不用调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索引依赖的存储引擎是myisam或innodb,Hash索引依赖的引擎是memory。
7. BTree索引依赖的存储银枪是myisam或innodb,有什么区别吗?
答:使用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+Tree。B+树是一个平衡的多叉树,从根节点到每个叶子节点的高度差值不超过1,而且同层级的节点间有指针相互链接。在B+树上的常规检索,从根节点到叶子节点的搜索效率基本相当,不会出现大幅波动,而且基于索引的顺序扫描时,也可以利用双向指针快速左右移动,效率非常高。
12. Hash索引的缺点有哪些?
答:Hash索引仅仅能满足等于索引,不能进行范围索引。
Hash索引无法被用来避免数据的排序操作。
Hash索引不能利用部分索引键查询。
Hash索引遇到大量哈希值重复的问题时,查询效率并一定比BTree索引高。
实际中,我们不用Hash索引,Hash索引依赖的引擎是memory,但现在mysql最常使用的引擎是myisam和innodb,甚至越来越只倾向于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)数据导入完毕后,集中建索引