MySQL优化实战

来源:互联网 发布:高考软件理科 编辑:程序博客网 时间:2024/05/29 08:06
1. 优化数据库表结构
要想获取好的性能,首先在设计数据库表时就应考虑。
ETS的表设计为:objectId, parentId, otag其中objectId为非空主键。
在使用当中要常利用objectId查询并添加记录,根据parentId查询具有相同父对象ID的子对象objectID记录,故因将
objectId和parentId分别建立相应的索引提高查询性能。

2. 优化查询语句
可以利用explain来解释select语句用于分析查询性能

下面的例子为利用parentId查询其子对象的otag,分别对比有无索引情况。


图1 其中dir4下有10个子对象
通过图1可以看出,在parentId未加索引的情况下 rows显示搜索了10616行记录,而下面对parentId加了索引后,只需要查询10条记录即可。
通过查看rows列可以让我们找到潜在的性能问题。Extra表该查询利用到了where条件判断语句,因此若利用where条件查询的多的情况下,应考虑对where判断的列增加索引。

3. 优化MySQL数据库存储引擎
由于ETS利用innodb,故此处以innodb配置举例。
相关的参数可以在mysql交互式模式下查看配置,若要持久化配置需修改配置文件重启后生效,相关参数的配置可以添加至配置文件(/etc/my.cnf)相应数据库实例中。
在此列举几个常用配置:
1. innodb_buffer_pool_size:默认为8M,可调节为物理内存的60%~80%,通常设置为比表空间大10%左右,视具体数据量大小而定。
2. innodb_log_file_size:决定recovery speed速度,太小影响查询性能,太大影响影响恢复数据,通常设置为256M折中。
3. innodb_log_buffer_size:用来缓冲日志数据,因写磁盘很慢,故适当调节写日志的缓冲大小,因1秒会刷新一次,不需要设到超过1秒的需求,一般设为4M。
4. innodb_flush_log_at_trx_commit:事务提交时对日志信息的处理,通常设定为2可提高写性能。
默认为1表示在每个事务提交时,日志缓冲被写到日志文件,对日志文件做到磁盘操作的刷新,其速度较慢。
为提高性能可设置为0或者2,
0表示日志缓冲每秒一次地被写到日志文件,并且对日志文件做到磁盘操作的刷新,任何mysqld进程的崩溃会删除崩溃前最后一秒的事务。
2表示在每个事务提交时,日志缓冲被写到文件, 但不对日志文件做到磁盘操作的刷新。只有操作系统崩溃或掉电才会删除最后一秒的事务,不然不会丢失事务。
5. innodb_thread_concurrency InnoDB kernel最大的线程数,常设定为CPU内核数x2
6. innodb_commit_concurrency同一时刻,允许多少个线程同时提交InnoDB事务默认值为0,表示允许任意数量的事务在同一时间点提交
7 . max_connections默认为100 ,并发量大时可适当调高