Excel-mysql-explain和慢查询

慢查询

1
2
3
4
5
6
7
8
9
查看“慢查询”的配置信息
show variables like "%slow%"
查看“慢查询”的时间定义
show variables like "long%";

设置“慢查询”的时间定义
set long_query_time=2;
开启慢日志
set global slow_query_log='ON';

Explain

作用同desc
返回SELECT语句中使用的每个表的一行信息

EXPLAIN输出列具体信息

Column JSON名称 含义
id select_id SELECT标识符
select_type 没有 SELECT类型
table table_name 输出行的表
partitions partitions 匹配的分区,通常不用
type access_type 连接类型
possible_keys possible_keys 可供选择的索引
key key 实际选择的指数
key_len key_length 所选键的长度
ref ref 列与索引进行比较
rows rows 估计要检查的行
filtered filtered 按表条件过滤的行的百分比
Extra 没有 附加信息

MySQL索引使用的注意事项

1.不要在列上使用函数和进行运算

不要在列上使用函数,这将导致索引失效而进行全表扫描。

2.尽量避免使用 != 或 not in或 <> 等否定操作符

应该尽量避免在 where 子句中使用 != 或 not in 或 <> 操作符,因为这几个操作符都会导致索引失效而进行全表扫描。

3.尽量避免使用 or 来连接条件

应该尽量避免在 where 子句中使用 or 来连接条件

4.多个单列索引并不是最佳选择

MySQL 只能使用一个单列索引,会从多个索引中选择一个限制最为严格的索引为了提高性能,可以使用复合索引

5.复合索引的最左前缀原则

复合索引遵守“最左前缀”原则,即在查询条件中使用了复合索引的第一个字段,索引才会被使用

6.覆盖索引的好处

如果一个索引自身就包含了所要查询字段的值,无需回行可直接获取数据(如组合索引,索引上就有数据无需去其对应主键去找)

7.范围查询对多列查询的影响

查询中的某个列有范围查询,则其右边所有列都无法使用索引优化查找
解决方案:
1.多列联合索引的情况下尽量避免前面的列使用索引
2.修改当前的联合索引,修改组合索引顺序
3.可以重新设计表结构进行优化
4.使用新服务,如redis

8.索引不会包含有NULL值的列

只要列中包含有 NULL 值都将不会被包含在索引中,复合索引中只要有一列含有 NULL值,那么这一列对于此复合索引就是无效的。
因此,在数据库设计时,除非有一个很特别的原因使用 NULL 值,不然尽量不要让字段的默认值为 NULL。

9.隐式转换的影响

当查询条件左右两侧类型不匹配的时候会发生隐式转换

10.like 语句的索引失效问题

like模糊查询当通配符写在最前面会出现索引无法使用的情况

##回行
对于myisam(非聚簇索引)叶子结点对应的是数据的物理地址,去物理地址获取数据的过程就是回行
对于innodb(聚簇索引),叶子结点对应了索引和数据本身,主索引不存在回行,辅助索引当中需要获取多个字段,在不使用组合索引的情况下就需要通过对应的主键到数据中去找,这一过程成为回行
所有辅助索引都是非聚簇索引,INNODB辅助索引存储的是主键的键

总结

  • SQL语句优化 ===1.避免嵌套查询 2.避免多表查询
  • 索引优化 === 1.正确建立索引 2.合理使用索引
  • 数据库结构优化
     1.垂直分表:把一个表中很多的字段,分成多个表存储
    2.水平分表:某个表中数据异常大,把表按照数据量进行切分,查询时不需要改变(user1,user2 不需要)
    3.分库:把一个非常大的系统分成n个子系统,不同的系统使用不同的库进行数据的操作但是会产生跨库操作
    
  • 系统配置优化
  • 服务器硬件优化

###负载均衡和读写分离

载均衡和读写分

###web服务器工作原理

eb服务器的工作原