索引
索引是一种单独的物理层面的数据结构,其作用是用于加速查询
mysql把数据存储到硬盘中,硬盘读写速度非常慢
一个应用程序,本质上就是对数据进行增删改查
一旦数据量比较大时,硬盘的响应速度变慢,给用户的感觉应用程序非常的慢
查询操作是应用程序使用中频率最高的操作
索引最终目的就是要提升查询速度
索引带来的问题:
1 添加索引后,整体的数据更多了(占用额外的磁盘空间)
2 由于有了索引,多数数据的添加修改删除,都会引发索引的重建(使增删改的效率降低)
索引不是越多越好
索引的实现:
查询之所以慢的原因,数据量大是一个问题
但最核心的问题就是硬盘IO操作速度问题
mysql通过B+树结构来组织数据
IO操作有一个预读的优化机制:操作系统会将相邻的数据也读取到内存中,来减少读取次数
mysql 通过B+树这种结构来减少IO操作
B+树种每一个磁盘块有两个数据项,三个地址,在查询时会比较大小
如果小于左边就访问左边的磁盘块,如果大于右边就访问右边的磁盘块否则就访问中间的磁盘块,与二分法相同,只不过每次把数据分成三段
聚集索引(主键)
主键索引,速度快因为只要根据id找到叶子节点
那么该行的所有数据都拿到了
innoDB需要用主键索引来建立数据结构,索引每一个表都应该有主键
辅助索引
除了主键索引之外的所有索引都是负责索引
辅助索引会单独创建树结构,其中存储索引数据本身以及该数据对应主键值
查找过程中肯定出现的情况
覆盖索引:是在当前树结构中就拿到了所有需要的数据
回表:是在负责索引中没有查询到需要的数据,就需要拿着id回到主键索引中查找
在编写sql时,如果有主键值,优先使用主键来查询
如果没有主键值,需要用辅助索引,尽量少查字段
最好保证需要的数据就在辅助索引中,避免使用select *
索引的优化,分为两方面
1 索引结构的优化
数据量小的,重复度低的做索引
2 sql语句的优化
sql语句中条件应该是索引字段
避免在模糊匹配中,在第一个字符使用%
不要对主键进行运算
3 and 与 or
在and语句红mysql会优化查询带有索引的字段,无论书写位置,都会先找主键
or语句不会自动选择索引,需要避免使用or语句
4 多字段联合索引
如果要查询的字段教多,为每一个字段都创建索引会造成额外的容量的占用并且当你修改一条记录时又可能索引都需要重建,会非常慢
建立多字段联合索引中顺序是重点
创建索引是,把重复度低的字段放在最左边,依次排开
编写sql语句时,保证重复度低的字段出现在sql语句中即可
创建索引语法
create index 索引的名字 on 表名(字段名);
删除索引
drop index 索引名字 on 表名;