性能优化——mysql数据库,性能优化mysql
一 mysql常用命令
1. 打开日志
1) show global variables like "%genera%";
2)set global general_log=on;
3)set global general_log=off;
2. mysql如果开了set autocommit=0,那么所有的语句一定是在一个事务里
3. show engine innodb status
1) http://imysql.cn/2008_05_22_walk_through_show_innodb_status
二 典型问题分析
1. 数据库等待锁超时 Lock wait timeout exceeded; try restarting transaction
1). 调整语句执行顺序,减少锁等待时间:涉及到的数据库操作比较多,事务比较大,把这些锁超时的表(多个事务并发可能取同一行的表,就会存在锁等待的情况)放在事务的最后面,执行完就释放锁了,减少其他事务的锁等待时间
2).切分事务:
3).语句合并,减少数据库网络交互:多条语句,并在一起,使用multiQuery,一次查询更新
2. DeadLock问题
3. 查看事务一直没提交的问题
mysql> show engine innodb status \G
查询active 的事务id
1.存储引擎的选择如果数据表需要事务处理,应该考虑使用InnoDB,因为它完全符合ACID特性。如果不需要事务处理,使用默认存储引擎MyISAM是比较明智的。并且不要尝试同时使用这两个存储引擎。思考一下:在一个事务处理中,一些数据表使用InnoDB,而其余的使用MyISAM.结果呢?整个subject将被取消,只有那些在事务处理中的被带回到原始状态,其余的被提交的数据转存,这将导致整个数据库的冲突。然而存在一个简单的方法可以同时利用两个存储引擎的优势。目前大多数MySQL套件中包括InnoDB、编译器和链表,但如果你选择MyISAM,你仍然可以单独下载InnoDB,并把它作为一个插件。很简单的方法,不是吗?
2.计数问题如果数据表采用的存储引擎支持事务处理(如InnoDB),你就不应使用COUNT(*)计算数据表中的行数。这是因为在产品类数据库使用COUNT(*),最多返回一个近似值,因为在某个特定时间,总有一些事务处理正在运行。如果使用COUNT(*)显然会产生bug,出现这种错误结果。
3.反复测试查询查询最棘手的问题并不是无论怎样小心总会出现错误,并导致bug出现。恰恰相反,问题是在大多数情况下bug出现时,应用程序或数据库已经上线。的确不存在针对该问题切实可行的解决方法,除非将测试样本在应用程序或数据库上运行。任何数据库查询只有经过上千个记录的大量样本测试,才能被认可。
4.避免全表扫描通常情况下,如果MySQL(或者其他关系数据库模型)需要在数据表中搜索或扫描任意特定记录时,就会用到全表扫描。此外,通常最简单的方法是使用索引表,以解决全表扫描引起的低效能问题。然而,正如我们在随后的问题中看到的,这存在错误部分。
5.使用“EXPLAIN”进行查询当需要调试时,EXPLAIN是一个很好的命令,下面将对EXPLAIN进行深入探讨。
参考资料:hi.baidu.com/...3.html
在mysql安装目录下,比如: D:\Program Files\MySQL\MySQL Server 5.1
里面有几个配置文件,只要修改名字成为 my.ini 即可,比如:
my-huge.ini 巨型服务器
my-large.ini 大型
my-medium.ini 中型
my-small.ini 小型
备份原来的,并重命名,重新启动即可。其中,[mysqld] 这一节是mysql服务器的配置信息。