什么是索引?
索引是帮助MySQL高效获取数据的数据结构,可以理解为,快速查找排好序的一种数据结构。
MySQL中的索引结构有两种:B+tree索引、Hash索引,我们通常所说的索引是指B+tree索引。
索引分类:普通索引,最基本的索引类型,没有唯一性限制,创建索引 create index <索引名字>on tablename(列的列表名);
修改表,例如 alter table tablename add index【索引名字】(列的列表)
创建表单时候指定索引
唯一索引,索引列的值必须唯一,但可以有空值。与普通索引基本一样,唯一区别是,索引列的所有值都只能出现一次,即必须唯一。
唯一索引的创建,create unique index<索引名字> on tablename(列的列表);
修改表,alter table tablename odd unique 【索引的名字】(列的列表)
创建表的时候指定索引,create table tablename (【...】,unique【索引名字】,(列的列表))
主键,是一种唯一索引,但他必须指定为“primary key”主键一般在创建表的时候指定,我们可以通过修改表的方式加入主键,每个表只能有一个主键。
单列索引和多列索引,多列索引有一个优点,它通过最左前缀的概念呈现出来。
复合索引,一个索引包含多个列。
分析索引效率,我们知道了一些索引的知识,但无法判断哪个索引最有效。MySQL中提供了一个内件的SQL命令帮助完成这个任务,这就是explain命令。
explain分析(执行计划):1.id id相同,自上而下执行;id不同,值越大越先被执行。
2.slecet-type
3.table table表示查询涉及的表或衍生的表。
例如:explain slecte tt. * from ()
4.type。它提供了判断查询是否高效的依据。
5.possible-keys. 他表示MySQL在查询时,可能使用到的索引。注意,即使有些索引在possible-keys中出现,但并不表示此索引会真正的被MySQL使用到,在查询时使用那些索引,由key字段决定。
6.key。 此字段是MySQL在当前查询时所真正使用到的索引,比如。请客吃饭possible-keys是应到多少人,key是实到多少人。
7.key-len。 表示查询优化器使用了索引的字节数,这个字段可以评估组合索引是否完全被使用。
8.ref。 表示显示索引的那一列被使用了,如果可能的话,是一个常量。
9.rows。 MySQL查询优化器根据统计信息,估计SQL要查询到结果集需要扫描读取的数据航数,这个值非常直观的显示SQL的效果的好坏,原则上row越少越好。
10. extra
什么情况下建立索引?什么情况下不建立索引?
主键自动建立唯一索引;频繁作为查询条件的字段应该创建索引;查询中与其他表关联的字段,外键关系建立索引;频繁更新的字段不合适建立索引;where条件里用不到的字段不建立索引;单健/复合索引的选择查询中排序的字段因建立索引
查询中统计或分组字段。
频繁增删改的表 表记录太少 数据重复且分布平均的表字段。(重复太多索引意义不大)
哈希索引
哈希索引就是采用一定的哈希算法,把健值换算成新的哈希值。检索时不需要类似B-tree那样从根节点到叶子节点逐级查询,只需要一次哈希算法即可立刻定位到相应的位置。查询速度非常快。
索引的缺点:1.占用磁盘空间。如果创建每一种可能列组合的索引,索引的文件的体积的增长速度远超过数据文件;如果有一个很大的表,索引文件的大小可能达到操作系统允许的最大文件限制。
2.对于需要写入数据的操作,例如:delete、update、insert操作。索引会降低他们的速度。这是因为MySQL不仅要把改动数据写入数据文件,而且还要把这些改动写入索引文件。
在大型的数据库中,索引是提高速度的一个关键因素。