(1) 索引的本质是什么?
索引其实是数据库表中字段值的复制,该字段成为索引的关键字
(2)MySQL中,数据是如何检索的?
MySQL在检索表中的数据的时候,先按照索引关键字的值在索引中进行查找,
如果能够查到,则可以直接定位到数据所在的起始页;
如果没有查到,只能全表扫描了
(3)一个数据库表只能创建一个索引吗?
不是,就像词典有拼音和部首两种检索方式一样,数据库表也可以创建多个索引
(4)什么是前缀索引?
索引中关键字的值可以是索引引用的字段值的一个部分,这种索引称为前缀索引.
例如,可以用姓名字段中的姓建立前缀索引,而不是全名
(5)索引可以是字段的组合吗?
可以,这种索引称为复合索引.
这些字段必须来自于同一张表,并且关键字的值必须是表中相应字段值的拷贝.
另外,数据库为了提高查询索引的效率,需要对索引的关键字进行排序
(6)能跨表创建索引吗?
不行
(7)索引数据需要额外的存储空间吗?
需要
就像书籍的目录需要几十页上百页来存放一样,索引也要额外的空间
(8) 同一个表中索引越多越好吗?
不是,索引可以提高查询的效率,但是会降低增删改的速度
(9)哪些字段适合选用作索引?
索引关键字的选取有以下原则:
原则1: 表的某个字段值的离散度越高,该字段越适合选作索引的关键字
例如,学生表中的性别字段的值要么是男要么是女,取值离散度只有2,不适合做索引
而学号字段则是一个学生对应一个学号,离散度很高,适合做索引
原则2:占用存储空间少的字段更适合选作索引的关键字
如果索引的关键字的值占用的存储空间较多,检索效率就会受到影响.
例如整数一般比字符串占用的空间少,更适合做索引
原则3:存储空间固定的字段更适合做索引
char类型的字段与text类型的相比更适合做索引
原则4:where子句中经常使用的字段应该创建索引,分组字段或者排序字段应该创建索引,两个表的连接字段应该创建索引
原则5:更新频繁的字段不适合创建索引,不会出现在where子句中的字段不适合创建索引
原则6:最左前缀原则
假设向一个表的多个字段(a,b,c)创建复合索引(索引名a_b_c)
当where的查询条件是以下各种字段的组合时,MySQL将使用a_b_c索引,其他情况将无法使用a_b_c索引
a,b,c
a,b
a
可以理解为一个复合索引a_b_c等价于(a_b_c , a_b , a)三个索引,基于最左前缀原则,应该尽量避免创建重复的索引(如在a字段上再单独建一个索引)
原则7:尽量使用前缀索引
前缀索引可以节省索引空间,提高检索效率
最后:
索引的设计技巧还有很多,没有索引的表一样可以完成数据检索,建立好的索引应该在加快检索效率和降低更新速度之间做好平衡