>检查您的硬件和操作系统是否已正确配置和调整:
>问题来源(CPU / IO /内存/交换使用).你有很多眼压吗? CPU是否已加载?如果你有很多阅读IOP可能你没有足够大的InnoDB buffer_pool.如果加载了CPU,则可能是查询执行全表扫描而不是使用正确的索引.
>磁盘/ RAID / LVM设置.在某些特定设置中,LVM striping可以通过均衡磁盘负载(无硬件RAID,连接多个LUN)为您带来好处
> IO调度程序:当你拥有良好的硬件RAID控制器时,可能noop是最好的. RedHat made some tests和他们说,对于Oracle(和其他DB)CFQ是最好的选择.您需要运行一些基准测试(如tpc-c或tpc-e)并选择最适合您硬件的基准测试.
>好的文件系统 – ext3在数据库特定的工作负载中表现不佳.更好的是XFS或OCFS2.你需要再做一些基准测试.
>观察,如果您的系统使用交换. Using swap degrades mysql performance.
>检查您的MySQL / InnoDB实例是否已正确调整:
>缓冲池大小 – 缓存内存中的数据页
> innodb_flush_method = O_DIRECT – 避免双IO缓冲
>增加InnoDB日志文件大小 – 对于写密集型工作负载,这可以提高性能.但请记住:更大的日志文件大小意味着更长的崩溃恢复有时在几个小时!
> innodb_flush_log_at_trx_commit = 0或2 – 如果您不关心ACID并且可能会在最后一两秒内丢失交易.
> key_buffer_size – 对MyISAM非常重要,但它用于磁盘临时表.
>观看你的INNODB STATUS
>分析您的工作负载 – 将所有查询捕获到slowquery日志并在其上运行mk-query-digest.您可以使用tcpdump and maatkit捕获所有查询
>您的大部分服务器时间需要哪些查询?
>是否创建了临时表,尤其是大型临时表?
> Learn, how to use explain
>您的申请是否使用交易?当您使用autocommit = 1(默认为MySQL)运行查询时,每个插入/更新查询都会开始新事务,这会产生一些开销.如果可能,最好禁用自动提交(默认情况下禁用python MySQL驱动程序自动提交)并在完成所有修改后手动执行提交.
>您的应用程序是否在循环中对同一个表进行一系列插入?对于一系列插入,加载数据infile命令要快得多.
>记住:从表中选择count(*);对于innodb比对myisam要慢得多.
>什么类型的INSERT / UPDATE查询占用大部分服务器时间?他们如何优化?
>检查,如果您的数据库具有正确的索引并根据需要添加它们.
In our environment we had situation,
that one type of update queries was
slow. Estimated time to finish batch
job was 2 days!!! After analyzing
slowquery log we find, that this type
of update query needs 4 seconds to
complete. Query looked like this:
update table1 set field1=value1 where
table1.field2=xx table2.field3=yy and
table2.field4=zz. After converting
update query to select query and
running explain on that select query
we find, that this type of query
doesn’t use index. After creating
proper index we had reduced update
query execution time to miliseconds
and whole job finished in less than
two hours.
一些有用的链接: