Mysql优化
MySQL 对于千万级的大表要怎么优化?-知乎
2k赞答案
1.5k赞答案
慢查询配置
SQL性能分析
SQL怎么优化
INSERT优化
SELECT优化
避免全表扫描
表结构优化
合理使用临时表
其他
索引覆盖和延迟关联
主从配置和读写分离
分区
2k赞答案
1.5k赞答案
慢查询配置
SQL性能分析
SQL怎么优化
INSERT优化
SELECT优化
避免全表扫描
表结构优化
合理使用临时表
其他
索引覆盖和延迟关联
主从配置和读写分离
分区
MySQL 对于千万级的大表要怎么优化?-知乎
2k赞答案
- 优化sql和索引
- 增加缓存
- 就做主从复制或主主复制,读写分离
- 分区,并针对分区优化sql
- 垂直拆分,分布式系统
- 水平切分,针对数据量大的表
答题者推荐学习:
- innodb为了避免二次查找可以使用索引覆盖技术
- 索引覆盖实现延迟关联
1.5k赞答案
- 数据库设计和表创建时就要考虑性能
- sql的编写需要注意优化
- 分区
- 分表
- 分库
慢查询配置
查看慢查询配置:
show variables like 'slow_query%';
show variables like 'long_query_time';配置慢查询:
可以通过全局变量设置和配置文件来设置。
set global slow_query_log='ON';
set global slow_query_log_file='/usr/local/mysql/data/slow.log';
set global long_query_time=1;在配置文件中设置,修改my.cnf,在[mysqld]下方配置。
slow_query_log = ON
slow_query_log_file = /usr/local/mysql/data/slow.log
long_query_time = 1配置完成后重启mysql
使用慢查询分析工具:mysqldumpslow命令
// 返回记录最多的10条sql
mysqldumpslow -s r -t 10 /path/to/slow.log
// 返回访问次数最多的10条sql
mysqldumpslow -s c -t 10 /path/to/slow.log
// 返回按照时间排序含有左连接的10条sql,可以结合 |more 使用
mysqldumpslow -s t -t 10 -g "lfet join" /path/to/slow.log | moreSQL性能分析
查看性能分析配置:show variables like 'profiling%';
开启性能分析:set profiling=1;
查看分析记录列表:show profiles;
根据query_id查看sql详细信息:
SHOW PROFILE [type [, type] ... ]
[FOR QUERY n]
[LIMIT row_count [OFFSET offset]]
type: {
ALL // 全部开销信息
| BLOCK IO // 硬盘IO开销
| CONTEXT SWITCHES // 上下文切换相关开销
| CPU // CUP开销
| IPC // 发送和接收开销
| MEMORY // 内存开销
| PAGE FAULTS // 页面错误开销
| SOURCE // Source_function ,Source_file,Source_line相关开销
| SWAPS // 交换分区开销
}SQL怎么优化
INSERT优化
INSERT DELAYED先将sql放入内存队列中,mysql空闲时插入。LOW_PRIORITY降低sql执行的优先级,也可以使用在UPDATE语句中。
SELECT优化
- 用
join代替子查询。 - 查询包括
GROUP BY,但我们想要避免排序带来的性能损耗,则可以指定ORDER BY NULL禁止排序。
避免全表扫描
- 在
where和order by涉及的列上创建索引或复合索引。 - 尽量避免在
where中判断is null和is not null。 - 尽量避免在
where中使用!=和<>操作符。 - 用
or连接条件,如果条件中的字段没有索引,可以使用union all来代替。 - 使用
in的条件语句,如果条件是连续的数值,可以使用between来代替。 - 很多情况可以使用
exists来代替in。 - 使用
like语句时,尽量使用左匹配name%,搜索数据量大的直接用搜索引擎。 - 在
where条件中使用了变量,可以使用tableName with(index(indexName))强制使用索引。 - 在
where条件中使用表达式和函数,尽量将表达式和函数放在操作符右边num=100*2。 - 使用复合索引时,尽量遵循最左前缀法则。
- 在
where条件中尽量避免类型转换。
表结构优化
- 一个表的索引控制在6个以内,索引在提高
select效率的同时,会降低insert和update效率。 clustered(聚簇)索引列的数据,尽量不要修改。INNODB引擎的主键就是聚簇索引。- 字符型字段
char定长可以增加sql效率,varchar可以节省存储空间。
合理使用临时表
其他
- 合理使用游标。
- 处理大量数据时,拆分处理。
- 使用
trace来查看一下强制使用辅助索引和全表扫描的开销。 - 使用
explain来查看sql执行效果。 - 开启慢查询,分析慢查询日志。
- 使用性能分析工具。
索引覆盖和延迟关联
mysql高效索引之覆盖索引-踏雪无痕SS
覆盖索引有何用?-成风魄郎
mysql覆盖索引详解-jh993627471
即只需扫描索引而无须回表,使用EXPLAIN查看SQL信息时Extra的值为Using index。
通过使用覆盖索引查询返回需要的主键,再根据主键关联原表获得需要的数据。
主从配置和读写分离
MySQL读写分离-架构-尼农小道
MySQL的读写分离的几种选择-疯狂110
MySQL读写分离介绍及搭建-bestvivi


浙公网安备 33010602011771号