Mysql
k8s
分页查询
mysql 延迟关联 优化 分页查询
| |
EXPLAIN
| |
结果
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | SIMPLE | xxx | null | const | PRIMARY | PRIMARY | 8 | const | 1 | 100 | null |
select_type: 表示对应行是简单查询还是复杂查询SIMPLE: 不包含子查询和union的简单查询PRIMARY: 复杂查询中最外层的selectSUBQUERY: 包含在select中的子查询 不在from的子句中DERIVED: 包含在from子句中的子查询mysql会将查询结果放入一个临时表中 此临时表也叫衍生表UNION: 在union中的第二个和随后的select,UNION RESULT为合并的结果
table: 表示当前行访问的表<derivedN>: 子查询 表示当前查询依赖id=N行的查询,所以先执行id=N行的查询
partitions: 查询将匹配记录的分区,对于非分区表该值为NULLtype: 表示关联类型或访问类型,MySql决定如何查找表中的行。 依次从最优到最差分别为system > const > eq_ref > ref > range > index > allNULL:MySql能在优化阶段分解查询语句,在执行阶段不用再去访问表或索引system和const:MySql对查询的某部分进行优化,并把其转化为一个常量.可以通过show warnings命令查看结果.system是const的一个特例表示表里只有一条元组匹配时为systemeq_ref: 主键或唯一键索引被连接使用,最多只会返回一条符合条件的记录.简单的select查询不会出现这种typeref: 相比eq_ref不使用唯一索引,而是使用普通索引或唯一索引的部分前缀,索引和某个值比较,会找到多个符合条件的行range: 通常出现在范围查询中,inbetween大于小于等. 使用索引来检索给定范围的行index: 扫描全索引拿到结果,一般是扫描某个二级索引,二级索引一般比较少,所以通常比ALL快一点ALL: 全表扫描 扫描聚簇索引的所有叶子节点
possible_keys: 此列显示在查询中可能用到的索引- 如果该列为
NULL则表示没有相关索引 - 可以通过检查
where子句是否可添加一个适当的索引来提高性能
- 如果该列为
key: 此列显示MySql在查询时实际使用到的索引。在执行计划中可能出现possible_keys列有值,而key列为null,这种情况可能是表中数据不多,MySql认为索引对当前查询帮助不大而选择了全表查询。如果想强制MySql使用或忽视possible_keys列中的索引,在查询时使用force index或ignore indexkey_len: 此列显示MySql在索引里使用的字节数,通过此列可以算出具体使用了索引中的哪些列,索引最大长度为 768 字节- 当长度过大时,
MySql会做一个类似最左前缀处理,将前半部分字符提取出做索引 - 当字段可以为
null时,需要一个字节去记录 - 计算规则:
- 字符类型:
char(n): n个数字或者字母占n个字节,汉字占3n个字节varchar(n): n个数字或者字母占n个字节,汉字占3n+2个字节.+2字节用来存储字符串长度
- 数字类型:
tinyint: 1字节smallint: 2字节int: 4字节bigint: 8字节
- 时间类型:
date: 3字节timestamp: 4字节datetime: 8字节
- 字符类型:
- 当长度过大时,
ref此列显示key列记录的索引中,表查找值时使用到的列或常量.常见的有const字段名rows此列是MySql在查询中估计要读取的行数,注意这里不是结果集的行数filteredExtra额外信息Using index使用覆盖索引(如果select后面查询的字段都可以从这个索引的树中获取,不需要通过辅助索引树找到主键,再通过主键去主键索引树里获取其它字段值)Using where使用where语句来处理结果,并且查询的列未被索引覆盖Using index condition查询的列不完全被索引覆盖,where条件中是一个查询的范围Using temporary MySql需要创建一张临时表来处理查询,出现这种情况一般都是要进行优化的Using filesort将使用外部排序而不是索引排序,数据较小时从内存排序,否则需要在磁盘完成排序Select tables optimized away使用某些聚合函数maxmin等来访问存在索引的某个字段
type-conversion
官网文档mysql5.7
以下规则描述了比较操作的转换是如何发生的:
- 如果一个或两个参数为NULL,则比较结果为NULL,但NULL-safe <=> 相等比较运算符除外。对于NULL <=> NULL,结果为真。不需要转换。
- 如果比较操作中的两个参数都是字符串,则将它们作为字符串进行比较。
- 如果两个参数都是整数,则将它们作为整数进行比较。
- 如果不与数字进行比较,十六进制值将被视为二进制字符串。
- 如果其中一个参数是 a TIMESTAMP or DATETIME 列而另一个参数是常量,则在执行比较之前,该常量将转换为时间戳。这样做是为了对 ODBC 更友好。这不是为 的参数完成的 IN()。为安全起见,在进行比较时始终使用完整的日期时间、日期或时间字符串。例如,要在使用BETWEEN日期或时间值时获得最佳结果 ,请使用CAST()将值显式转换为所需的数据类型。
- 来自一个或多个表的单行子查询不被视为常量。例如,如果子查询返回要与DATETIME 值进行比较的整数,则比较将作为两个整数进行。整数不会转换为时间值。要将操作数作为DATETIME值进行比较 ,请使用 CAST()将子查询值显式转换为DATETIME。
- 如果其中一个参数是十进制值,则比较取决于另一个参数。如果另一个参数是十进制或整数值,则将参数作为十进制值进行比较,如果另一个参数是浮点值,则作为浮点值进行比较。
- 在所有其他情况下,参数将作为浮点(实数)数进行比较。例如,字符串和数字操作数的比较是作为浮点数的比较进行的。
example:
| |
commands
建库
| |
创建用户 且 赋予权限
| |
导出数据库
| |
导入数据库
进入数据库操作 登录
| |
设置
| |
直接导入
| |
table
| |
data
| |
ONLY_FULL_GROUP_BY
mysql5.7 sql_mode 默认开启 ONLY_FULL_GROUP_BY 问题。参考博客
| |
my.cnf 末尾添加
| |
Tags: