? 查询优化
? 关联优化
? 分页优化
? 复杂语句
max_connections
,buffer pool的大小innodb_buffer_pool_size
等。总结:最主要的优化策略还是索引优化和SQL优化,之后就是再调整下Mysql的配置参数,想读写分离、分库分表在系统架构设计的时候就需要确定,后续变更的成本太高。
几个问题主要代表了MySQL实践过程中年可能会碰到的问题。
explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。通过一下语句可以查看查询计划:
EXPLAIN SELECT [查找字段名] FROM tab_name ...
查询计划结构中每个字段的含义:
1. id列
id列的编号是 select 的序列号,有几个 select 就有几个id,并且id的顺序是按 select 出现的顺序增长的。
2. select_type列
select_type 表示对应行是简单还是复杂的查询。
3. table列
这一列表示 explain 的一行正在访问哪个表。
4. partitions列
如果查询是基于分区表的话,partitions 字段会显示查询将访问的分区。
5. type列
这一列表示关联类型或访问类型,即MySQL决定如何查找表中的行,查找数据行记录的大概范围。
依次从最优到最差分别为:system > const > eq_ref > ref > range > index > ALL;一般来说,得保证查询达到range级别,最好达到ref。
6. possible_keys列
这一列显示查询可能使用哪些索引来查找。
7. key列
这一列显示mysql实际采用哪个索引来优化对该表的访问。
8. key_len列
这一列显示了mysql在索引里使用的字节数,通过这个值可以算出具体使用了索引中的哪些列。
9. ref列
这一列显示了在key列记录的索引中,表查找值所用到的列或常量,常见的有:const(常量),字段名(例:film.id)
10. rows列
这一列是mysql估计要读取并检测的行数,注意这个不是结果集里的行数。
11. filtered 列
该列是一个百分比的值,rows filtered/100 可以*估算出将要和 explain 中前一个表进行连接的行数(前一个表指 explain 中的id值比当前表id值小的表)。
12. Extra列
这一列展示的是额外信息
MySQL数据库数据超过2000w,基本就达到了性能瓶颈,可以考虑通过分库分表来分担单点压力。但是分布分表会带来一些问题,比如对于一些排序、连接等功能会失效,或者对于单条insert、update语句会失效。以下就几个问题进行探讨。
(1)如何进行拆分?
对于分布分表,通用方式有水平拆分和垂直拆分。水平拆分是将一张表的数据水平切分为多张表来保存,可以用到的方式是按照ID范围或者进行hash运算后拆分;垂直拆分是将一张表的字段拆分成多组,每一组放到一张表中,这种一般情况下可以根据业务来进行拆封。
(2)数据如何进行排序?
对于拆分后的数据怎么进行排序?有个思路是根据查询语句select * from t1 order by id
向数据库分片查询数据,查询的数据汇集到内存,如果有N个分片,则会存在N个数据块,再通过归并排序的方式对其进行排序。
(3)如何生成分布式ID?
业界有比较多的生成分布式ID的算法,核心思路是分布式ID的不同分段代表的含义不一样,比如前部分代码时间,中间部分代表数据库实例,最后部分代表的是表的自增序列。
可是事后开启慢查询监控,当数据库SQL执行超过一定时长,再做优化。
使用druid数据库连接池就能查看到慢查询日志。
我正在参与 腾讯云开发者社区数据库专题有奖征文。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。