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 | more
SQL性能分析
查看性能分析配置: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
分区
MySQL表的四种分区类型-鍒樻爧
MySQL分区总结-iVictor