第06章_索引的数据结构.pdf
基础
1.查询去重
select distinct username from employees;
2.常见函数
单行函数
分组函数
传入一组值,返回一个值
和分组函数一同查询的字段要求是group by后面的字段
分组查询的筛选条件分两类
字符串函数
数学函数
日期函数
3.count(*)和count(1)
效率:
MYISAM存储引擎下 count(*)效率高,有内部计数器直接返回了个数
INNODB存储引擎下,效率差不过,但是要比count(字段)高,因为字段要判断是否为null
多表查询
内连接
用左边表的记录去匹配右边表的记录,如果符合条件的则显示。如:从表.外键=主表.主键
隐式内连接
SELECT 字段名 FROM 左表, 右表 WHERE 条件
select * from emp,dept where emp.dept_id
= dept.id
; (等值连接,where后面条件是>或<这种就非等值连接
比如查询工资的等级)
非等值连接
自连接
把e看成员工表,m看成领导表
显式内连接
SELECT 字段名 FROM 左表 [INNER] JOIN 右表 ON 条件
外连接
总结
子查询
外键?
表复制
1.复制表结构
create table 新表名 like 旧表名;
2.复制表结构+数据
create table 新表明 select *from 旧表名
事务
隔离级别
视图
进阶
1.SQL执行流程
sql服务器处理客户端请求流程
2.存储引擎
总结
InnoDB : 索引即数据,占用内存较高,支持事务,支持行级锁,索引和数据一起存储,适用于并发量高,频繁做更新删除操作
MyISAM : 不支持事务,行级锁,外键,访问速度快,索引和数据分开存储,适用于频繁查询和插入操作,针对数据统计有额外的常数存储所以count(*)效率高
2.1 InnoDB行格式
2.1.1 compact行格式
变长字段长度列表
MySQL 支持一些变长的数据类型,比如 VARCHAR间、 BINARY(M)、 各种 TEXT 类型、各种 BLOB 类型.我们也可以把拥有这些数据类型的列称为变长字段.变 长字段中存储多少字节的数据是不固定的,所以我们在存储真实数据的时候需要顺便把这些数
据占用的字节数也存起来,这样才不至于把 MySQL 服务器销懵 也就是说这些变长字段占用 的存储空间分为两部分
- 真正的数据内容.
- 该数据占用的字节数.
COMPACT 行格式中,所有变长字段的真实数据占用 字节数都存放在记录的开头位
置,从而形成一个变长字段长度列表,各变长字段的真实数据占用的字节数按照列的顺序逆序存放.再次强调一遍,是逆序存放
NULL值列表
一条记录中的某些列可能存储 NULL 值,如果把这些 NULL 值都放到记录的
真实数据中存储会很占地方,所以 COMPACT 行格式把一条记录中值为 NULL 的列统一管理起来 ,存储到 NULL 值列表中
记录头信息
记录头 信息由固定的5字节组成,用于描述记录的一些属性. 字节也就是 40 个二进制位 不同的位代表不同的意思
记录的真实数据
MySQL 会为每个记录默认地添加一些列(也称为隐藏列)
这里需要提一下 InooDB 表的主键生成策略 优先使用用户自定义的主键作为主键,如果用户没有定义主键 则选取一个不允许存储 NULL 值的 UNIQUE 键键作为主键 如果表中连不允许存储 NULL值的 UNIQUE 键都没有定义,InooDB 会为表默认添加一个名为 row_id 隐藏列作为主键.
3.索引
3.1 为什么用索引(索引的优点)
- 索引是存储引擎用于快速查找数据的一种数据结构,可以减少磁盘I/O次数,加快查询速率
- 创建唯一索引,可以保证数据库中每一行数据的唯一性
- 在实现数据的参考完整性方面,可以加速表和表之间的连接。换句话说,对于有依赖关系的子表和父表联合查询时,可以提高查询速度。
- 在使用分组和排序子句进行数据查询时,可以显著减少查询中分组和排序的时间 ,降低了CPU的消耗。
索引缺点
- 创建和维护索引耗费时间,数据量增加,所耗费时间也会增加
- 索引需要占磁盘空间
索引提高查询速度的同时会降低更新表的速度,当表中数据进行增删改操作时,索引也要动态维护,这样就降低了数据的维护速度
3.2 InnoDB索引的结构
聚簇索引
非聚簇索引(二级索引,辅助索引)
联合索引(非聚簇索引中的一种)
3.3 InnoDB的B+树索引的注意事项
根页面位置不变
内节点中目录项记录的唯一性
3.4 MyISAM索引结构
可以理解为myISAM没有聚簇索引,只有二级索引,myISAM分两个文件存储,一个存储数据,另一个存储索引,索引文件仅仅保存数据记录的地址,
3.5 对比
3.6 哪些情况下适合创建索引
字段的数值有唯一性的限制
- 频繁的为where查询条件的字段
- 经常group by 和order by的列
- 如果group by 和order by都有使用可以建立联合索引,注意group by 的列放在前面
- update,delete的where条件
- distinct字段需要创建索引
- 多表join连接操作时,创建索引注意事项
7. 使用列的类型小的创建索引
- 使用字符串前缀创建索引
- 区分度(散列性高)的列适合作为索引
- 使用最频繁的列放到联合索引的左侧
-
3.7 限制索引的数目
建议单标索引数量不超过6个
原因 每个索引要占用磁盘空间
- 索引会影响insert,delete,update等语句的性能
优化器在选择如何优化查询时,会根据同一信息,对每一个可以用到索引来进行评估,以生成出一个最好的执行计划,如果同时有很多个索引都可以用于查询,会增加MySQL优化器生成执行计划时间,降低查询性能
3.8 哪些情况下不适合创建索引
在where,group by,order by中使用不到的字段,不要设置索引
- 数据量小的表中不要使用索引
- 有大量重复数据的列上不要建立索引
- 避免对经常更新的表创建过多的索引
- 不建议用无需的值作为索引
- 删除不再使用或很少使用的索引
- 不要定义冗余或重复的索引
数据库调优
当我们遇到数据库调优问题的时候,该如何思考呢?这里把思考的流程整理成下面这张图。
整个流程划分成了 观察(Show status) 和 行动(Action) 两个部分。字母 S 的部分代表观察(会使
用相应的分析工具),字母 A 代表的部分是行动(对应分析可以采取的行动)。
第09章_性能分析工具的使用.pdf
explain使用
列名 | 描述 |
---|---|
id | 在一个大的查询语句中每个SELECT关键字都对应一个 唯一的id |
select_type | SELECT关键字对应的那个查询的类型 |
table | 表名 |
partitions | 匹配的分区信息 |
type | 针对单表的访问方法 |
possible_keys | 可能用到的索引 |
key | 实际上使用的索引 |
key_len | 实际使用到的索引长度 |
ref | 当使用索引列等值查询时,与索引列进行等值匹配的对象信息 |
rows | 预估的需要读取的记录条数 |
filtered | 某个表经过搜索条件过滤后剩余记录条数的百分比 |
Extra | 一些额外的信息 |