mysql> show variables like '%slow_query_log%';
+---------------------+-----------------------------------------+
| Variable_name | Value |
+---------------------+-----------------------------------------+
| slow_query_log | OFF |
| slow_query_log_file | /var/lib/mysql/VM-100-3-centos-slow.log |
+---------------------+-----------------------------------------+
2 rows in set (0.00 sec)
mysql> set global slow_query_log='ON';
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like '%slow_query_log%';
+---------------------+-----------------------------------------+
| Variable_name | Value |
+---------------------+-----------------------------------------+
| slow_query_log | ON |
| slow_query_log_file | /var/lib/mysql/VM-100-3-centos-slow.log |
+---------------------+-----------------------------------------+
2 rows in set (0.00 sec)
mysql> set global long_query_time=1;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like '%long_query_time%';
+-----------------+-----------+
| Variable_name | Value |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set (0.00 sec)
mysql> show variables like '%innodb_buffer_pool_size%';
+-------------------------+-----------+
| Variable_name | Value |
+-------------------------+-----------+
| innodb_buffer_pool_size | 134217728 |
+-------------------------+-----------+
1 row in set (0.00 sec)
mysql>
4、调优------SQL
4.1 查询调优
(1)尽量用到索引
未用到索引的情况
对应筛选条件 没建立索引,那就不会用到索引
-【数据量比较小】创建了索引不一定会用到索引,数据库本身有优化机制
如何查看表创建的索引 :show index from 表;
如何检测SQL语言用到索引
查看执行计划:EXPLAIN sql 语句
执行计划内容:
主要看Type字段,从上往下 --- 逐步变慢
索引最好的状态就是以下三种
1)consts 单表中最多只有一个匹配行(主键或者唯一索引),在优化阶段即可读取到数据
2)ref 指的是使用普通的索引(normal index)
3)range 对索引进行范围检索
下面三种都比较慢type=index,索引物理文件全扫描,速度非常慢,这个 index 级别比较 range 还低,与全表扫描是小巫见大巫
(2)尽量避免查询不需要的数据查询需要的信息
避免:select *
实际业务场景,可能只需要记录的 部分字段
原因:查询不需要的数据 -- 占内存、网络带宽最终 影响 响应时间、吞吐量
(3)避免大量的表关联 join
一条SQL查询 涉及的表越多, SQL越慢
阿里巴巴 内部: 禁止出现 3张表以上的关联查询
(4)搜索场景严禁左模糊或者全模糊
like 模糊查询可能导致索引失效
右模糊走索引,左模糊、全模糊不走索引
右模糊 'aa%'
全模糊:'%aa%'
左模糊: '%aa'
(5)功能设计: 不论表大小,都要加上分页的参数
防止 后续数据库表数据增加,而产生性能问题
性能测试-- 针对未来的某个场景模拟 未来表数据增加之后,系统是否能够支撑
4.2 更新调优
非必要,不要主动锁数据
数据库 提供SQL语句,主动 锁表/锁记录
如果因为数据被锁,而导致 请求变慢 【监控 数据库 锁等待信息】 及时关闭事务
事务 会导致 数据库 锁表/锁数据 情况
操作完数据库之后,没有及时 关闭事务,可能导致其他操作数据的变慢 大量更新可以用批处理
业务场景
数据导入功能
数据批量删除/修改
数据库 -- 批量执行多条SQL语句
插入 -- values sql
5、调优------表结构
设计表的时候。就要考虑索引
数据量非常大的时候,创建索引是很慢的
创建索引也可能导致数据库变卡
表结构可以适当的做一些冗余
字段允许适当冗余,以提高查询性能,但必须考虑数据一致。冗余字段应遵循:
1)不是频繁修改的字段。
2)不是 varchar 超长字段,更不能是 text 字段。正例:商品类目名称使用频率高,字段长度短,名称基本一成不变,可在相关联的表中冗余存储类目名称,避免关联查询。