索引(一)

1.索引是什么?

索引,就是有助于加速表中检索的数据,当从表查询数据时,首先MySQL会检查索引是否存在,然后MySQL使用索引选择表的精确物理对应行,而不是扫描整个表

  • 索引是帮助MySQL高效获取数据的数据结构

  • 索引存储在文件系统

  • 索引的文件存储形式存储引擎有关(MySQL的存储引擎: InnoDB【目前MySQL默认】 、MyISAM、MERGE,MEMORY、ARCHIVE、CSV、BLACKHOLE、PERFORMANCE_SCHEMA、Federated)

    • 存储引擎:数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以获得特定的功能。现在许多不同的数据库管理系统都支持多种不同的数据引擎。

      因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(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),主存和磁盘以页为单位交换数据。

 

posted @ 2021-10-28 21:03  s_妙锦  阅读(94)  评论(0)    收藏  举报