引言
就算使用了缓存,大量的数据库访问依旧在所难免,即使设置了较长的缓存有效期,而且缓存命中率较理想,但缓存的创建和过期后的重建都是需要访问数据库的;
本文主要从MySQL表结构设计规范和MySQL自身性能优化两方面来讨论该如何对MySQL数据库进行优化;
MySQL表结构设计规范
1. 数据库设计命名规范
(1)数据库,数据表一律使用前缀,前缀名称一般不超过5字;
# 正式数据库名使用小写英文以及下划线组成,尽量说明是哪个应用或者系统在使用的;
mcs_webim
ops_portal
# 备份数据库名使用正式库名加上备份时间组成;
ops_portal_20150621
mcs_webim_20150622
# 相关应用的数据表使用同一前缀,前缀名称一般不超过5字;
webim_user
webim_group
# 备份数据表名使用正式表名加上备份时间组成;
webim_user_20150620
webim_group_20150620
(2)字段名称使用单词组合完成,首字母小写,后面单词的首字母大写(驼峰式),最好是带表名前缀;
# 如表webim_user的字段
userId
userName
userPassword
# 表与表之间的相关联字段要用统一名称;
# 用尽量少的存储空间来存储一个字段的数据;
2. 数据库规范化设计
(1)范式化设计
实际关系模式设计中,一般遵循第三范式——在一个数据表中,非主键字段之间不能存在依赖关系;
具体可参考:规范化—数据库设计原则
(2)反范式化设计
举例:在页面显示我的好友列表;
1.遵循第三范式
(用户ID, 好友ID)
(用户ID, 用户昵称, 用户邮箱, 注册时间, 联系电话)
2.反范式化设计
(用户ID, 好友ID, 好友昵称)
(用户ID, 用户昵称, 用户邮箱, 注册时间, 联系电话)
反范式化问题:
1. 数据冗余;
2. 更新导致数据不一致问题,可通过定期同步的手段来修改不一致数据;
反范式化优势:
减少读取数据的开销,这点非常重要,需要根据不同场景来适当使用反范式化设计;
MySQL自身性能优化
MySQL自身优化主要从如下几方面来介绍:
1. Query语句优化;
2. 慢查询优化;
3. MySQL锁机制分析优化;
4. 参数配置优化;
Query语句优化
1. MySQL状态报告
show status;
show engine innodb status;
一些更加友好的第三方工具:mysqlreport(下载地址),mysqltunner,mytop等,可展示更加友好的状态报告;
2. 正确使用索引
如果索引使用不当,其他任何优化将毫无意义;
索引目的
索引类似于书的目录,通过不断的缩小想要获得数据的范围来筛选出最终想要的结果,加快查询速度;
索引类型
索引分单列索引和组合索引,组合索引的一个索引包含多列;