慢查询
1 | 查看“慢查询”的配置信息 |
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服务器工作原理