数据库访问变慢,解决方案及优化方向,如何优化mysql!
① 存储层 存储引擎 列类型选择 范式(三范式)
② 设计层 索引 缓存 分区表
③ sql层 使用执行效率高的sql语句,explain执行计划,慢查询日志记录
④架构层 分布式数据库架构, 使用多态数据库服务器,解决数据库访问并发的问题 主从复制 从服务器复制主服务器数据
二 缓存设置
1查看并开启缓存
mysql> show variable like ‘query_cache%’;
mysql> set global query_cache_size=64* 1024*1024; 设置缓存空间大小
2缓存失效
当数据表结构发生改变时,缓存会失效。(比如插入数据,及更改数据);
3使用不到缓存的情况
当sql语句中存在时间值或者随机数时,就会使用不到缓存
select * ,now() from tablename where epassword like “sdfasd”;
4生成多个缓存
由于sql语句大小写,空格等,会被认为是多条不同的sql语句,就会生成多个缓存
5不使用缓存
使用sql_no_cache 语法,不使用到缓存
select sql_no_cache * from tablename where epassword like “asfads”;
6缓存其他操作
①查看缓存使用的状态
mysql>show status like ‘Qcache%’;
②清空缓存
mysql>reset query cache;
三分表设计
一般业务环境中,索引,缓存,内存缓存优化,能够满足大部分业务使用需要的速度。
但大数据不能够支撑,可以选择分区表。把大数据分配到多个数据表中,以提高数据的读写速度。 分片
分区表 分表类型
① 逻辑分区 分表 真实还是一个表 ,逻辑分为多个,使用sql语句和单表相同
②物理分表 把数据分配到几个真实数据表中,sql语句需要确定操作哪个表
2四种格式的逻辑分表
逻辑分区分类
①取余方式 key/value 会根据数据表的算法分配多个表中
②条件方式 range/list 数据满足某一个分表的条件,就被分配到分表。
分表条件必须是主键或者是主键的一部分(联合主键)
2.1key 分表
partition by key(字段) partitions 分区数目
partition by hash(表达式(字段)) partitions 分区数目
partition by range(字段/表达式)(
partition 名称1 values less than (常量),
partition 名称2 values less than(常量),
);
分表管理
数据表已经建立好,或者分区数据表后期需要增加或者删除表。 可以进行相应的数据表进行管理。
4物理分表设计
物理分表的方式
①水平分表
②垂直分表
水平分表 把数据表进行横向割,数据是完整一行row。根据某个字段的取值范围。
慢查询日志设置
慢查询:如果执行的sql语句,返回数据时间,大于设置的事件(规定的时间),这个sql语句就被认为是一个慢查询。
①慢查询日志的开启,日志的位置
mysql>show variables like ‘slow_query%’;
mysql>set global slow_query_log =1;
②快慢时间临界点
mysql>show variables like ‘long_query_time’;
mysql> set long_query_time =1; //设置慢查询时间临界值1s
其他优化
在长期的数据,索引文件和数据文件,都将产生空洞,形成碎片 ,可以通过一个操作(不产生对数据实质性的影响的操作)修改表,修改表语法操作。
通过修改表语句,进行表的碎片修复。
optimize table 表名。
修改表碎片需要时间,不要经常做此操作。可以周期执行。