Mysql——调优
目录
硬件优化
架构设计优化
SQL优化
索引优化
慢SQL优化
硬件优化
CPU、内存、磁盘
架构设计优化
- 缓存
- 读写分离
- 分库分表
SQL优化
- 查询时尽量不要使用*
- 多表查询时一定要以小驱大
- 不要使用like左模糊和全模糊查询(最左匹配原则)
- 对于多插入的情况进行批量插入
- 查询时尽量不要对字段做空值判断
- 当出现基于字段做空值判断的情况时,会导致索引失效,因为判断null的情况不会走索引,一般用not null定义字段,如果想为空的字段可以用个0、""这类空字符代替。
- 尽量避免深分页的情况出现
- SELECT * FROM user_login_log LIMIT 1000000, 100;
- SELECT * FROM user_login_log where id > 1000000 LIMIT 100;增加索引where条件,缩减数据范围
- 字段结构优化
- 对于姓名字段,一般都会限制用户名长度,这时不要无脑用varchar,使用char类型更好。
- 对于一些显然不会拥有太多数据的表,主键ID的类型可以从int换成tinyint、smallint、mediumit。
- 对于日期字段,不要使用字符串类型,而更应该选择datetime、timestamp,一般情况下最好为后者。
- 对于一些固定值的字段,如性别、状态、省份、国籍等字段,可以选择使用数值型代替字符串,如果必须使用字符串类型,最好使用enum枚举类型代替varchar类型。
索引优化
- 避免索引失效的问题
- 长字段建立索引,可以选用字段值的前N个字符创建索引(建立前缀索引)
- 不在做范围查询的字段上建立索引,可以选用hash结构代替B+Tree结构,因为Hash结构的索引是所有数据结构中最快的,散列度足够的情况下,复杂度仅为O(1)。
- 使用Explain执行分析工具
- 关注type、key、rows、filtered、extra这几个字段
- key:如果该值为空,则表示未使用索引查询,此时需要调整SQL或建立索引。
- type:这个字段决定了查询的类型,如果为index、all就需要进行优化。
- rows:这个字段代表着查询时可能会扫描的数据行数,较大时也需要进行优化。
- filtered:这个字段代表着查询时,表中不会扫描的数据行占比,较小时需要进行优化。
- Extra:这个字段代表着查询时的具体情况,在某些情况下需要根据对应信息进行优化。
- 关注type、key、rows、filtered、extra这几个字段
慢SQL优化
慢SQL:查询的SQL语句耗费较长的时间
- 慢SQL日志
- 开启慢sql日志,根据慢sql日志发现执行慢的sql,对sql进行优化处理,线上建议不用开启会影响性能,可以在准生产或者是压测的情况下开启来监控慢sql
- 开启慢查询日志 set global slow_query_log = on;
- 查询默认的慢查询阈值(默认为10秒) show variables like 'long_query_time';
- 手动修改慢查询阈值(设置为10ms) set global long_query_time = 0.01;
- 排查思路
- 慢sql日志 一般公司会有平台 如果有监控 可以配置慢sql报警
- 拿到慢sql 首先使用explain分析 注意看type和row 看type是否是在ref或之下
- 如果是在explain分析没有发现问题 看performance具体分析是哪个环节耗时较长
- 如果都没有问题 再排查慢sql时刻的数据库负载情况
- 使用show processlist 显示当前正在执行的mysql连接; show STATUS 查看mysql当前状况