Mysql与InnoDB优化
Mysql可以从以下几个方面进行数据库优化:
SQL及索引优化:
sql优化:
- 优化count
- 优化max 通过索引优化
- 优化子查询
- 优化group by
避免查询使用临时表和文件排序,尽量使用索引
eg:查询每个演员所参演的影片的数量 影片表和演员表 优化前 Explain select actor.frist_name,actor.last_name,,count(*) from file_actor inner join actor using(actor_id) group by film_actor.actor_id 优化后 Explain select actor.frist_name,actor.last_name,c.cnt from actor inner join(select actor_id,count(*) as cnt from film_actor Group By actor_id) As c using(actor_id)- 优化limit查询
- 借助Mysql慢日志查询
索引优化:
- 如何选择适合的列建立索引
- 在where从句,group by从句,order by从句,on从句中出现的列
- 索引字段越小越好
- 离散度大的列放在联合索引的前面
- 索引的维护及优化: 查找重复及冗余索引
select a.TABLE_SCHEMA AS '数据名', a.TABLE_NAME AS '表名', a.INDEX_NAME AS '索引1', b.INDEX_NAME AS '索引2', a.COLUMN_NAME as '重复列名' from STATISTICS a JOIN STATISTICS b ON a.TABLE_SCHEMA = b.TABLE_SCHEMA AND a.TABLE_NAME = b.TABLE_NAME AND a.SEQ_IN_INDEX = b.SEQ_IN_INDEX AND a.COLUMN_NAME = b.COLUMN_NAME;
数据库表结构
- 选择合适的数据类型
- 表的范式化和反范式化设计
- 表的垂直拆分:
- 把不常用的字段单独存放到一个表中
- 把大字段独立存放到一个表中
- 把经常用到的字段放到一起
- 表的水平拆分:
- 对 id 进行hash运算,如果要拆分成5个表,则使用摸底(id,5)取出0~4个值
- 针对不同的hashID把数据存到不同的表中
系统配置
网络方面的配置,要修改 /etc/sysctl.conf
#增加tcp支持的队列数 net.ipv4.tcp_max_syn_backlog=65535 #减少断开连接时,资源回收 net.ipv4.tcp_max_tw_buckets=8000 bet.ipv4.tcp_tw_reuse=1 net.ipv4.tcp_tw_recycle=1 net.ipv4.tcp_fin_timeout=10 #打开文件数的限制 /etc/security/limits.conf * soft nofile 65535 * hard nofile 65535 关闭 iptables 等防火墙Mysql 的配置
SELECT engine,ROUND(SUM(data_length+index_length)/1024/2014,1) AS "Total MB" FROM INFORMATION_SCHEMA.TABLES WHERE table_schema not in ("information_schema","performance_schema") GROUP BY ENGINE; #系统中每一种引擎表的大小innodb_buffer_pool_size #重要,缓冲池的大小 推荐总内存量的75%,越大越好。 innodb_buffer_pool_instances #该参数可以控制缓冲池的个数,默认只有一个缓冲池,如果一个缓冲池中并发量过大,容易阻塞,此时可以分为多个缓冲池; innodb_log_buffer_size #innodb log 缓冲大小,由缓冲区刷新到磁盘,由于日志最长每秒钟就会刷新所以一般不用太大 innodb_flush_log_at_trx_commit #关键,数据库多长时间把数据刷新到磁盘,默认值为1,可取0,1,2三个值,0表示每一秒钟把变更刷新到磁盘,1表示每一次提交会把变更刷新到磁盘,2表示每一次提交刷新到缓冲区然后每一秒从缓冲区刷新到磁盘,建议设置为2,如果数据安全性要求较高则使用默认值1 innodb_read_io_threads #Innodb读IO进程数,默认为4 innodb_write_io_threads #Innodb 写IO 进程数,默认为4 innodb_file_per_table #on表示每个表使用独立的表空间,默认为 off,也就是所有的表都会建立在共享表空间上,设为on可提高并发效率 innodb_stats_on_metadata # 决定Mysql在什么情况下会刷新innodb表的统计信息,一般关掉