通过此文档对Mysql数据库及IBATIS使用过程中的常见问题和优化方式进行简单提示性描述,指导研发人员正确的设计和使用数据库,提高程序运行质量。
一、Mysql数据库性能指标参数
1、 IO
解释:IO有四种类型:连续读,随机读,随机写和连续写,连续读写的IO size通常比较大,主要衡量吞吐量,而随机读写的IO size比较小,主要衡量IOPS和响应时间。数据库中的全表扫描是连续读IO,索引访问则是典型的随机读IO,日志文件是连续写IO,而数据文件则是随机写IO。
目标:尽量减少查询中的IO次数、提高IOPS、加快IO响应时间
尽量集中写,提高吞吐量。
2、 CPU
解释:数据库在进行order by,group by,distinct等时将进行大量的cpu计算,造成cpu繁忙
目标:降低CPU计算
二、Mysql数据库使用建议
1、 使用并正确使用索引
单列索引(where、order by、join on等字段)、复合索引(最左前缀原则,where和orderby同时出现时)、在索引中完成查询、在索引中完成排序、
2、 Mysql使用Nested Loop Join,永远用小结果集驱动大的结果集,并减少嵌套循环总次数
3、 根据实际情况确定先过滤数据再排序还是先排序再过滤数据(举例:先分页再JOIN)
4、 尽量避免select *而只选取自身需要的Column
5、 避免大量复杂Join,适度分拆对象
6、 使用join代替子查询,尽量不使用mysql中的子查询
7、 尽量少使用OR,使用union或者union all来代替or
8、 牢记在一次数据访问中一般只能利用一个索引,where多条件请使用复合索引而不是建多个单列索引
9、 更新频繁的字段不适合创建索引
10、
使用不等于(<>或者!=)的时候,Mysql无法使用索引
11、
使用Like操作的时候如果条件以通配符开始(如%abc…)Mysql无法使用索引
12、
合理正确的使用应用层缓存
13、
InnoDB会产生死锁,死锁通常都可以在应用设计层面解决,通过调整业务流程、数据库对象设计、事务大小,以及访问数据库的SQL语句,绝大部分死锁都可以避免,可采用不会话中顺序访问表,批量处理数据时事先对数据排序等方式解决死锁问题。
14、
正确使用悲观锁(for update)和乐观锁(版本比对)机制解决数据冲突问题
三、数据库设计优化建议
1、 对不经常变化的数据可进行适当冗余,从而尽量减少Join
2、 通过选用更“小”的数据类型减少存储空间,使查询相同数据需要的IO资源降低
3、 通过合适的数据类型加速数据的比较
四、 Mysql数据库使用调优方式
1、 Explain:使用explain命令查看SQL语句的执行计划
可访问以下地址学习:
http://dev.mysql.com/doc/refman/5.1/zh/optimization.html#explain
http://isky000.com/database/mysql-explain-detail
2、 Query Profiler:使用SHOW PROFILE ***命令查看SQL语句执行时CPU和IO统计细节,比较不同SQL语句的系统消耗情况
可访问一下地址学习:
http://dev.mysql.com/doc/refman/5.1/en/show-profiles.html
五、 数据库及IBATIS使用中常见问题说明(待补充)
1、索引是不是越多越好?