MYSQL索引、存储引擎

记录:

1,索引的数据结构:B+ Tree

2,查找、删除、插入如何操作:

查找:首先在根节点进行二分查找,找到一个key所在的指针,然后递归地在指针所指向的节点进行查找。直到查找到叶子节点,然后在叶子节点上进行二分查找,找出key所对应的data。

插入删除会破坏平衡树的平衡性,因此插入删除操作,需要对树进行分裂、合并、旋转等操作。

3,Mysql有哪些索引:

a. B+Tree 索引:大多数MYSQL存储引擎的默认索引类型。

适用于:全键值、键值范围和键前缀查找。键前缀查找只适用于最左前缀查找。
Innodb的B+Tree索引分为主索引和辅助索引。主索引的叶子节点data域记录完整的数据记录,这种索引方式称为聚簇索引,因为无法把数据行存放在两个不同的地方,所以一个表只能有一个聚簇索引。
辅助索引记录叶子节点记录主键的值,通过主键的值,去主索引表中查找所需数据。

b. 哈希索引:能够以O(1)的时间进行查找,失去了有序性

缺点:无法进行排序和分组;只支持精确查找,无法用于范围查找和部分查找。
注意:InnoDB 存储索引有一个特殊的功能:自适应哈希索引,当某个索引值被使用的非常频繁时,会在B+Tree索引上再创建一个hash索引,这样B+Tree索引具有哈希索引的一些优点,方便快速哈希查找。

c. 全文索引:用于查找文本中的关键词,而不是直接比较是否相等。 原理:倒排索引实现,记录关键词到所在文档的映射。

查找条件:MATCH AGAINST,不是普通的Where
Innodb引擎在5.6.4版本后开始支持全文索引
空间数据索引:MyiSAM引擎支持空间数据索引(R-Tree),用于存储地理数据

4, 索引的优点有哪些:

  • 加快查找速度,减少服务器需要扫描的数据行数

  • 帮助服务器避免进行排序和分组,以及避免创建临时表(B+Tree索引是有序的,可以用于Order By和Group By操作),临时表主要是在排序和分组的过程中创建,由于不需要排序和分子,也就不需要创建临时表

  • 将随机I/O变为顺序I/O

5,什么时候去使用索引:

  • 对于非常小的表,大部分情况下简单的全表扫描比简历索引更高效
  • 对于中到大型的表,索引就非常有效
  • 对于特大型的表,建立和维护索引的代价会随之增长。此情况下,需要用到一种技术可以直接区分出需要查询的一组数据,而不是用一条记录去匹配,例如分区技术

6,如何进行查询优化?(3):分析+数据访问+查询方式

使用Explain进行分析

EXPLAIN用来分析SELECT查询语句,通过分析结果来优化查询语句。常见字段:select_type:查询类型,有简单查询、联合查询、子查询等。key:使用的索引;rows:扫描的行数

优化数据访问
  • 减少请求的数据量:只返回必要的列(尽量不用select *),只返回必要的行(limit限制数据数目);缓存重复查询的数据;
  • 减少服务端扫描的行数(使用索引)
重构查询方式
  • 切分大查询:一个大查询如果一次性执行的话,可能会锁住很多数据,占满整个事务日志、耗尽资源、阻塞很多小的但重要的查询。所以,可以通过for/while循环一次性查询一定的量
  • 分解大连接查询:将连接查询分解成对每个单表的查询,在服务器后端进行关联。
    优点:
    a. 缓存更加高效,对于连接查询,如果其中一个表发生变化,则整个查询缓存无法使用,分解后的多个查询,即使其中 一个表发生改变,对于其他表的查询缓存依旧可以使用。
    b. 分解成单表后,这些单表查询的缓存,有可能被其他查询语句适用到。
    c. 减少锁竞争
    d. 在应用层进行连接,更容易对数据进行拆分,做到高性能和可伸缩

7,Mysql存储引擎有哪些?隔离级别分别是什么?

  • Innodb(默认):支持事务,行级锁,外键约束,表加密
    实现四个标准的隔离级别:默认级别可重复读(REPEATABLE READ),在可重复读隔离级别下,通过多版本控制(MVCC)+间隙锁(Next-key locking)防止幻影读
    主索引是聚簇索引,索引中保存了数据,从而避免直接读取磁盘。
    支持真正的在线热备份。
  • MyISAM:不支持事务,不支持行级锁,只有表级锁,支持压缩表,空间数据索引等。
    由于是表级锁,当读取时对需要读到的所有表加共享锁,写入时对所有表加排它锁,但在表有读取操作的同时,也可以向表中插入新的记录,被称为并发插入(CONCURRENT INSERT)
    如果指定了DELAY_KEY_WRITE选项,每次修改执行完成后不会立即将修改的索引数据写入磁盘,而是写到内存中的键缓冲区,只有在清理键缓冲区或者关闭表的时候才会将对应的索引块写入磁盘。可以极大的提升写入性能,但是在数据库或者主机崩溃时会造成索引损坏,需要执行修复操作
  • Memory
  • Merge
  • ARCHIVE

8,如何进行索引优化?

  • 独立的列:索引列不能是表达式的一部分,也不能是函数的参数,否则无法使用。
SELECT actor_id FROM db.actor where actor_id + 1 = 5
//无法使用索引
  • 多列索引(联合索引):当需要使用多个列作为条件进行查询时,使用多列索引比使用多个单列索引性能更好。
SELECT film_id, actor_id FROM film_actor WHERE actor_id = 1 AND film_id = 1
//建议使用多列索引
  • 索引列的顺序:让选择性最强的索引列放在前面

索引的选择性是指:不重复的索引值和记录总数的比值。最大值为 1,此时每个记录都有唯一的索引与其对应。选择性越高,查询效率也越高。

SELECT COUNT(DISTINCT staff_id)/COUNT(*) AS staff_id_select,
COUNT(DISTINCT customer_id)/COUNT(*) AS customer_id_select,
COUNT(*)
FROM payment

//结果:
  staff_id_selectivity: 0.0001
customer_id_selectivity: 0.0373
               COUNT(*): 16049

所用选择customer_id列放在多列索引的前面

  • 前缀索引:对于 BLOB、TEXT 和 VARCHAR 类型的列,必须使用前缀索引,只索引开始的部分字符。对于前缀长度的选取需要根据索引选择性来确定。
  • 索引包含所有需要查询的字段的值。

具有以下优点:

索引通常远小于数据行的大小,只读取索引能大大减少数据访问量。
一些存储引擎(例如 MyISAM)在内存中只缓存索引,而数据依赖于操作系统来缓存。因此,只访问索引可以不使用系统调用(通常比较费时)。
对于 InnoDB 引擎,若辅助索引能够覆盖查询,则无需访问主索引。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页