MySQL:优化

一、优化步骤

如上图所示,优化步骤:表结构与索引优化 -> SQL语句优化 -> MySQL参数优化 -> 硬件及系统配置优化

优化成本:从左到右依次增加;优化效果:从右到左依次减弱。

开发人员注重前两种优化;DBA人员注重后两种优化。

二、优化方案

2.1 表结构与索引优化

  1. 分库分表,读写分离;
  2. 为字段选择合适的数据类型;
  3. 将字段多的表分解成多个表,增加中间表;
  4. 混用范式与反范式,适当冗余;
  5. 为查询创建必要索引,但避免滥用;
  6. 尽可能使用NOT NULL,影响索引效率。

2.2 SQL语句优化

优化方案:

  1. 寻找最需要优化的语句:分析慢查询日志;
  2. 利用分析工具:explain(分析语句执行计划,是否使用索引)、profile(分析某个语句分布耗时);
  3. 避免使用SELECT *,只取需要的列;
  4. 尽量使用prepared statements(性能更好,防止SQL注入);
  5. 使用索引扫描来排序。

优化用例

(1)查询优化

1 不使用子查询

例:SELECT * FROM t1 WHERE id (SELECT id FROM t2 WHERE name=’hechunyang’);

2 避免函数索引

例:SELECT * FROM t WHERE YEAR(d) >= 2016;
由于MySQL不像Oracle那样支持函数索引,即使d字段有索引,也会直接全表扫描。
应改为—–>
SELECT * FROM t WHERE d >= ‘2016-01-01’;

3 用IN来替换OR

低效查询
SELECT * FROM t WHERE LOC_ID = 10 OR LOC_ID = 20 OR LOC_ID = 30;
—–>
高效查询
SELECT * FROM t WHERE LOC_IN IN (10,20,30);

4 LIKE双百分号无法使用到索引

SELECT * FROM t WHERE name LIKE ‘%de%’;
—–>
SELECT * FROM t WHERE name LIKE ‘de%’;
目前只有MySQL5.7支持全文索引(支持中文)

5 读取适当的记录LIMIT M,N

SELECT * FROM t WHERE 1;
—–>
SELECT * FROM t WHERE 1 LIMIT 10;

6 避免数据类型不一致

SELECT * FROM t WHERE id = ’19’;
—–>
SELECT * FROM t WHERE id = 19;

7 分组统计可以禁止排序

SELECT goods_id,count(*) FROM t GROUP BY goods_id;
默认情况下,MySQL对所有GROUP BY col1,col2…的字段进行排序。如果查询包括GROUP BY,想要避免排序结果的消耗,则可以指定ORDER BY NULL禁止排序。
—–>
SELECT goods_id,count(*) FROM t GROUP BY goods_id ORDER BY NULL;

8 避免随机取记录

SELECT * FROM t1 WHERE 1=1 ORDER BY RAND() LIMIT 4;
MySQL不支持函数索引,会导致全表扫描
—–>
SELECT * FROM t1 WHERE id >= CEIL(RAND()*1000) LIMIT 4;

9 禁止不必要的ORDER BY排序

SELECT count(1) FROM user u LEFT JOIN user_info i ON u.id = i.user_id WHERE 1 = 1 ORDER BY u.create_time DESC;
—–>
SELECT count(1) FROM user u LEFT JOIN user_info i ON u.id = i.user_id;

(2)索引优化

 

(3)插入优化

  1. 插入多行:INSERT INTO VALUES ('yayun',23),('tom',26),('atlas',32),('david',25)
  2. 插入延迟:INSERT  DELAYED
  3. 当从一个文本文件装载一个表时,使用LOAD DATA INFILE。通常比使用很多的INSERT语句快。

更多优化:

https://www.cnblogs.com/binbinyouni/p/6070715.html

https://blog.csdn.net/u014320421/article/details/79875862

2.3 MySQL参数优化

修改my.ini配置文件

1、连接数

  1. max_connections:最大连接数

2、查询缓存

  1. query_cache_type:可以是0,1,2,0代表不使用缓存,1代表使用缓存,2代表根据需要使用;
  2. query_cache_size:设置 Query Cache 所使用的内存大小,默认值为0,大小必须是1024的整数倍,如果不是整数倍,MySQL 会自动调整降低最小量以达到1024的倍数;
  3. query_cache_limit:允许缓存的单条查询结果集的最大容量,默认是1MB,超过此参数设置的查询结果集将不会被缓存;
  4. query_cache_min_res_unit:设置查询缓存Query Cache每次分配内存的最小空间大小,即每个查询的缓存最小占用的内存空间大小。

3、索引缓存?

4、排序缓存?

5、插入缓存

  1. bulk_insert_buffer_size:这只对MyISAM表有用

2.4 硬件及系统配置优化

  1. 禁用swap:swap是linux的虚拟内存技术,使用swapoff -a关闭swap,尽量只使用内存来提高MySQL访问速度,但要考虑内存不足的问题。
  2. 升级内存
  3. 升级固态硬盘

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值