索引(理解)
1、索引(index)
1.1、什么是索引?
索引是在数据库表的字段上添加的,是为了提高查询效率存在的一种机制。
一张表的一个字段可以添加一个索引,当然,多个字段联合起来也可以添加索引
索引相当于一本书的目录,是为了缩小扫描范围而存在的一种机制。
t_user
id(idIndex) name(nameIndex) email(emailIndex) address (emailAddressIndex)
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1 zhangsan
2 lisi
3 wangwu
4 zhaoliu
5 hanmei
6 jack
select * from t_user where name = ‘jack’;
以上的这条SQL语句会去name字段上扫描。
因为查询条件是:name = 'jack'
如果name字段上没有添加索引(目录),或者说没有给name字段创建索引。
Mysql会进行全扫描,会将name字段的每一个值都比对一遍,效率低
MySQL在查询方面主要是两种方式:
第一种方式:全表扫描
第二种方式:根据索引检索
在mysql数据库中索引也需要排序,这个排序和TreeSet数据结构相同。TreeSet底层是一个自平衡的二叉树,在mysql
当中索引是一个B-Tree数据结构。
mysql中:遵循左小右大原则存放。采用中序遍历方式遍历取数据
1.2、索引实现原理:
假设有一张用户表:t_user
id(PK) name 每一行记录在硬盘上都有物理存储编号
--------------------------------------------------------------------------------------------------------------------------------------
100 zhangsan 0x1111
120 lisi 0x2222
99 wangwu 0x8888
98 zhaoliu 0x9999
101 jack 0x6666
55 lucy 0x5555
130 tom 0x7777
提醒1:在任何数据库当中主键都会自动添加索引对象,id字段上自动有索引,因为id是PK。
另外在mysql中,一个字段上如果有unique约束的话,也会自动创建索引对象。
提醒2:在任何数据库中,任何一张表的任何一条记录在硬盘存储上都有一个硬盘的物理存储编号
提醒3:在mysql中,索引是一个单独的对象,不同的存储引擎以不同的形式存在,在MyISAM存储引擎中,
索引存储在一个.MYI文件中。在InnoDB存储引擎中索引存储在一个逻辑名称叫做tablespace中。
在MEMORY存储引擎当中索引被存储在内存中。不管索引存储在哪,索引在mysql中都是一个以树的形式存在
(自平衡二叉树:B-Tree)
1.3、在mysql中,主键上,以及unique字段上都会自动添加索引的!!!
什么条件下,会考虑给字段添加索引?
条件1:数据量庞大(到底多大算大,需要测试,每一个硬件环境都不一样)
条件2:该字段经常出现在where的后面,以条件的形式存在,就是说这个字段总是被扫描
条件3:该字段很少的DML(insert,delete,update)操作。(因为DML之后,索引需要重新排序)
建议不要随意添加索引,因为索引也需要维护,太多反而会降低系统性能。
建议通过主键查询,通过unique的约束的字段去查询,效率是比较高的