Mysql优化


MySQL 对于千万级的大表要怎么优化?-知乎

MySQL 对于千万级的大表要怎么优化?-知乎

2k赞答案

  1. 优化sql和索引
  2. 增加缓存
  3. 就做主从复制或主主复制,读写分离
  4. 分区,并针对分区优化sql
  5. 垂直拆分,分布式系统
  6. 水平切分,针对数据量大的表

答题者推荐学习:

  1. innodb为了避免二次查找可以使用索引覆盖技术
  2. 索引覆盖实现延迟关联

1.5k赞答案

  1. 数据库设计和表创建时就要考虑性能
  2. sql的编写需要注意优化
  3. 分区
  4. 分表
  5. 分库

返回顶部

慢查询配置

查看慢查询配置:

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怎么优化

数据库SQL优化大总结之 百万级数据库优化方案-雲霏霏

INSERT优化

  1. INSERT DELAYED先将sql放入内存队列中,mysql空闲时插入。
  2. LOW_PRIORITY降低sql执行的优先级,也可以使用在UPDATE语句中。

SELECT优化

  1. join代替子查询。
  2. 查询包括GROUP BY,但我们想要避免排序带来的性能损耗,则可以指定ORDER BY NULL禁止排序。

使用索引排序
1613861-20190305214216991-50406121.png

返回顶部

避免全表扫描

  1. whereorder by涉及的列上创建索引或复合索引。
  2. 尽量避免在where中判断is nullis not null
  3. 尽量避免在where中使用!=<>操作符。
  4. or连接条件,如果条件中的字段没有索引,可以使用union all来代替。
  5. 使用in的条件语句,如果条件是连续的数值,可以使用between来代替。
  6. 很多情况可以使用exists来代替in
  7. 使用like语句时,尽量使用左匹配name%,搜索数据量大的直接用搜索引擎。
  8. where条件中使用了变量,可以使用 tableName with(index(indexName))强制使用索引。
  9. where条件中使用表达式和函数,尽量将表达式和函数放在操作符右边num=100*2
  10. 使用复合索引时,尽量遵循最左前缀法则。
  11. where条件中尽量避免类型转换。

表结构优化

  1. 一个表的索引控制在6个以内,索引在提高select效率的同时,会降低insertupdate效率。
  2. clustered(聚簇)索引列的数据,尽量不要修改。INNODB引擎的主键就是聚簇索引。
  3. 字符型字段char定长可以增加sql效率,varchar可以节省存储空间。

合理使用临时表

其他

  1. 合理使用游标。
  2. 处理大量数据时,拆分处理。
  3. 使用trace来查看一下强制使用辅助索引和全表扫描的开销。
  4. 使用explain来查看sql执行效果。
  5. 开启慢查询,分析慢查询日志。
  6. 使用性能分析工具。

返回顶部

索引覆盖和延迟关联

mysql高效索引之覆盖索引-踏雪无痕SS
覆盖索引有何用?-成风魄郎
mysql覆盖索引详解-jh993627471

即只需扫描索引而无须回表,使用EXPLAIN查看SQL信息时Extra的值为Using index
通过使用覆盖索引查询返回需要的主键,再根据主键关联原表获得需要的数据。

返回顶部

主从配置和读写分离

MySQL读写分离-架构-尼农小道
MySQL的读写分离的几种选择-疯狂110
MySQL读写分离介绍及搭建-bestvivi

返回顶部

分区

MySQL表的四种分区类型-鍒樻爧
MySQL分区总结-iVictor

返回顶部

转载于:https://www.cnblogs.com/tangch/p/10479976.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值