黑马MySQL数据库从入门到精通-进阶篇 1
黑马MySQL数据库从入门到精通-进阶篇 1
智汇君黑马MySQL数据库从入门到精通-进阶篇 1
存储引擎
MySQL体系结构
简介
1 | 存储引肇就是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引肇是基于表的,而不是基于库的,所以存储引擎也可被称为表类型 |
在创建表时,指定存储引擎
1 | CREATE TABLE 表名( |
查看当前数据库支持的存储引擎
1 | SHOW ENGINES; |
InnoDB介绍
1 | 介绍 |
InnoDB逻辑存储结构
MyISAM介绍
1 | 介绍 |
1 | xxx.sdi:存储表结构信息 |
Memory介绍
1 | 介绍 |
三个常见引擎的区别
面试题
1 | Innodb和MyISAM的区别:主要是事务,行级锁,外键的区别 |
选择
1 | 在选择存储引擎时,应该根据应用系统的特点选择合适的存储引擎。对于复杂的应用系统,还可以根据实际情况选择多种存储引擎进行组 |
索引
索引概述
1 | sql优化大多依赖索引进行 |
1 | 介绍 |
1 | select * from people where age=45; 无索引->全表扫描 |
1 | 优缺点 |
索引结构
1 | MySQL的索引是在存储引擎层实现的,不同的存储引擎有不同的结构,主要包含以下几种: |
二叉树红黑树(预备知识)
1 | 红黑树(Red Black Tree)是一种自平衡二叉查找树 |
B-Tree多路平衡查找树(预备知识)
B+Tree(预备知识)
1 | 相对于B-Tree区别: |
MySQL中B+Tree的结构
1 | MySQL索引数据结构对经典的B+Tree进行了优化。在原B+Tree的基础上,增加一个指向相邻叶子节点的链表指针,就形成了带有顺序指针的B+Tree,提高区间访问的性能。 |
Hash
1 | 哈希索引就是采用一定的hash算法,将键值换算成新的hash值,映射到对应的槽位上,然后存储在hash表中 |
1 | Hash索引特点 |
1 | 存储引擎支持 |
思考
1 | 为什么InnoDB存储引擎选择使用B+tree索引结构? |
索引分类
InnoDB存储引擎中(聚集索引和二级索引对于理解sql优化很关键)
1 | 聚集索引选取规则: |
思考
1 | 第一个 |
1 | B+tree的每一个节点都是存放在一个个页当中的,一个页16k |
索引语法
创建索引
1 | CREATE [UNIQUE|FULLTEXT] INDEX index_name ON table(index_col_name,...) |
查看索引
1 | SHOW INDEX FROM table_name; |
删除索引
1 | DROP INDEX index_name ON table_name; |
案例
1 | create index idx_user_name on tb_user(name); |
1 | create unique index idx_user_phone on tb_user(phone); |
1 | 联合索引(联合索引中字段的顺序很重要) |
SQL优化
SQL性能分析工具
SQL执行频率
1 | MySQL客户端连接成功后,通过show [session|global] status命今可以提供服务器状态信息。通过如下指令,可以查看当前数据库的INSERT、UPDATE、DELETE、SELECT的访问频次: |
慢查询日志
1 | 慢查询日志记录了所有执行时间超过指定参数 (long_query_time,单位:秒,默认10秒)的所有SQL语句的日志 |
1 | show variables like 'slow_query_log'; |
profile详情
1 | show profiles 能够在做SQL优化时帮助我们了解时间都耗费到哪里去了。通过have_profiling参数,能够看到当前MYSQL是否支持profile操作: |
1 | SELECT @@have_profiling; 查看是否支持 |
1 | SELECT @@profiling; 查看是否打开 |
1 | show profiles;查看当前会话各个sql语句执行时长 |
1 | show profile for query query_id; 某条语句执行时长细分析 |
explain执行计划
1 | EXPLAIN或者DESC命令获取MySQL如何执行SELECT语句的信息,包括在 SELECT语句执行过程中表如何连接和连接的顺序。语法: |
结果字段
id
1 | select查询的序列号,表示查询中执行selet子句或者是操作表的顺序(id相同,执行顺序从上到下;id不同,值越大,越先执行)。 |
select_type(了解)
1 | 表示SELECT的类型,常见的取值有SIMPLE(简单表,即不使用表连接或者子查询)、 |
type(重要)
1 | 表示连接类型,性能由好到差的连接类型为NULL、System、const、eq_ref、ref、range、index、all |
1 | NULL 查询时不访问任何表 |
possible_key(重要)
1 | 显示可能应用在这张表上的索引,一个或多个 |
key(重要)
1 | 实际用到的索引 |
key_len(重要)
1 | 表示索引中使用的字节数,该值为索引字段最大可能长度,并非实际使用长度,在不损失精确性的前提下,长度越短越好 |
rows(重要)
1 | MySQL认为必须要执行查询的行数,在innodb引擎的表中,是一个估计值,可能并不总是准确的 |
filtered
1 | 表示返回结果的行数占需读取行数的百分比,filtered的值越大越好 |
extra(重要)
1 | 额外信息 |
索引使用规则
1 | id是主键 |
1 | sn字段没有建索引 |
1 | 对sn字段建立索引 |
验证索引效率
最左前缀法则
1 | 如果索引了多列(联合索引),要遵守最左前缀法则。最左前缀法则指的是查询从索引的最左列开始,并且不跳过索引中的列。 |
不跳过任何中间一列
缺少最后一列
缺少最后两列
不符合最左前缀法则
缺少中间列
1 | 导致部分索引失效(status) |
注意
1 | 最左前缀法则与where条件中的位置无关,存在就行 |
范围查询
1 | 联合索引中,出现范围查询(>,<),范围查询右侧的列索引失效 |
1 | 在联合索引的范围查询情况下,尽量使用>= |
索引列运算
1 | 不要在索引列上进行运算操作,索引将失效 |
字符串不加单引号
1 | 字符串类型字段使用时,不加引号,索引将失效 |
1 | phone字段在这里是字符串类型 |
模糊查询
1 | 如果仅仅是尾部模糊匹配,索引不会失效。如果是头部模糊匹配,索引失效。 |
OR连接的条件
1 | 一侧有索引,另一侧没有索引会导致索引失效 |
1 | 用or分割开的条件,如果or前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会被用到。 |
1 | 下面两种索引失效 |
1 | 解决方法就是对age字段建立索引 |
数据分布影响
1 | 如果MySQL评估使用索引比全表更慢,则不使用索引。 |
is null和is not null
SQL提示
1 | SQL提示,是优化数据库的一个重要手段,简单来说,就是在SQL语句中加入一些人为的提示来达到优化操作的目的。 |
1 | 单列索引,联合索引 |
同一个字段既有联合又有单列索引
1 | 最终走了联合索引 |
use index
1 | 建议,mysql不一定采用 |
ignore index
force index
覆盖索引&回表查询
1 | 尽量使用覆盖索引(查询使用了索引,并且需要返回的列,在该索引中已经全部能够找到),减少select *(避免出现回表查询) |
1 | 知识小贴士: |
1 | 这两个都只进行了一次索引扫描 |
思考(面试题)
1 | 为username,password建立一个联合索引 |
前缀索引
1 | 当字段类型为字符串(varchar,text等)时,有时候需要索引很长的字符串,这会让索引变得很大,查询时,浪费大量的磁盘IO,影响查询效率。此时可以只将字符串的一部分前缀,建立索引,这样可以大大节约索引空间,从而提高索引效率。 |
1 | 可以根据索引的选择性来决定,而选择性是指不重复的索引值(基数)和数据表的记录总数的比值,索引选择性越高则查询效率越高 |
建立前缀索引
前缀索引查询流程
1 | 二级索引中匹配到后,在聚集索引中还要进行匹配(因为只是截取的部分字符),二级索引顺序链表后续也要匹配 |
索引设计原则
1 | (尽量使用联合索引) |
1 | 针对于数据量较大(300w条),且查询比较频繁的表建立索引。 |













































































































