索引(一)
1.索引是什么?
索引,就是有助于加速表中检索的数据,当从表查询数据时,首先MySQL会检查索引是否存在,然后MySQL使用索引选择表的精确物理对应行,而不是扫描整个表
-
索引是帮助MySQL高效获取数据的数据结构
-
索引存储在文件系统中
-
索引的文件存储形式与存储引擎有关(MySQL的存储引擎: InnoDB【目前MySQL默认】 、MyISAM、MERGE,MEMORY、ARCHIVE、CSV、BLACKHOLE、PERFORMANCE_SCHEMA、Federated)
-
存储引擎
因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(Table Type,即存储和操作此表的类型)。
-
![]()
-
![]()
-
InnoDB:
-
支持事务,是事务安全的,提供行级锁与外键约束,有缓冲池,用于缓冲数据和索引。
-
适用场景:用于事务处理,具有ACID事物支持,应用于执行大量的insert和update操作的表。
-
-
MyISAM:
-
不支持事务,不支持外键约束,不支持行级锁,操作时需要锁定整张表,不过会保存表的行数,所以当执行select count(*) from tablename时执行特别快。
-
适用场景:用于管理非事务表,提供高速检索及全文检索能力,适用于有大量的select操作的表,如 日志表
-
-
MEMORY :
-
使用存在于内存中的内容创建表,每一个memory只实际对应一个磁盘文件。因为是存在内存中的,所以memory访问速度非常快,而且该引擎使用hash索引,可以一次定位,不需要像B树一样从根节点查找到支节点,所以精确查询时访问速度特别快,但是非精确查找时,比如like,这种范围查找,hash就起不到作用了。另外一旦服务关闭,表中的数据就会丢失,因为没有存到磁盘中。
-
适用场景:主要用于内容变化不频繁的表,或者作为中间的查找表。对表的更新要谨慎因为数据没有被写入到磁盘中,服务关闭前要考虑好数据的存储
-
-
-
索引文件的结构
-
hash
-
二叉树
-
B树
-
B+树
-
索引类似于书的目录。比如要查找某个主题,首先查找索引,然后打开具有该主题的页面(页码),而不扫描整本书。
索引分为单列索引和组合索引,单列索引指的是一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引指的是一个索引包含多个列。
2.什么时候需要创建索引?
表的数据量过大而且业务中需要频繁查询,查询速度慢时,创建索引的列必须是where子句条件,否则查询时,就没有用到索引,条件可以是<,<=,=,>,>=,between,in,都会使用到索引,不要使用not in和<>(不等于),like条件是'%xxx'时不会用到索引,‘xxx%’时可以用到索引
3.索引的缺点是什么?
索引对查询速度可以大幅度提示,但是不准滥用,创建索引后,对表数据进行insert/update和delete时,同样会对索引文件进行修改,影响更新速度,第二建立索引会占用磁盘空间的索引文件。
4.创建一个索引:
语法:
create index 索引名称 on 表名(列名(length));
列名(length):如果类型是varchar等 需要写长度,数字类型不需要;
也可以在建表时创建索引:index 索引名(列名(length))
5.唯一索引:
唯一索引就是这个列的所有值都不能重复,并添加索引
主键就是唯一索引,每个表只能有一个主键
创建语法:
create unique index 索引名称 on 表名(列名(length));
6.删除索引:
语法:
drop index 索引名称 on 表名;
7.查看索引:
语法:
show index from 表名;
实例:
1.给sc表的sid字段创建索引;
create index index_sc_sid on sc(sid);
2.给order_1表创建唯一索引;
create unique index index_order1_orderid on order_1(order_id(6));
3.查看order_1表的索引;
show index from order_1;
4.删除sc表的sid字段的索引;
drop index index_sc_sid on sc;
常见的索引面试题:
1.数据库中最常见的慢查询优化方式是什么?
2.为什么加索引能优化慢查询?
3.你知道哪些数据结构可以提高查询速度?
4.那这些数据结构既然都能优化查询速度,MySQL为何选择使用B+树?
基础知识储备:
局部性原理:
-
空间局部性:程序和数据的访问都有聚集成群的倾向,在一个时间段内,仅使用其中一小部分;
-
时间局部性:或者最近访问过的程序代码和数据,很快又被访问的可能性很大;
磁盘预读(预读的长度一般为页(page)的整数倍):
-
页是存储器的逻辑块,操作系统往往将主存和磁盘存储区分割为连续大小相等的块,每个存储块称为一页(在许多操作系统中,页大小通常为4k),主存和磁盘以页为单位交换数据。


浙公网安备 33010602011771号