一、库表设计
1.1 引擎选择
在mysql5.1中,引入了新的插件式存储引擎体系结构,允许将存储引擎加载到正在运行的mysql服务器中。使用mysql插件式存储引擎体系结构,允许数据库专业人员或者设计库表的软件开发人员为特定的应用需求选择专门的存储引擎,完全不需要管理任何特殊的应用编码要求,也不用考虑所有的底层实施细节。
因此,尽管不同的存储引擎具有不同的能力,应该用程序是与之分离的。此外,使用者可以在服务器、数据库和表格三个层级中存储引擎,提供了极大的灵活性。
mysql常用的存储引擎包括Myisam、Innodb和Memory,其中有一下特点:
Myisam:全表锁拥有较高的执行速度,一个写请求,其他的相同表格的所有读写请求救护阻塞,并发性差,占用空间相对较小,mysql5.5及以下仅myisam支持全文索引,不支持事务。
Innodb:行级锁(sql都走索引查询),并发性相对强,占用空间是myisam的2.5倍,不支持全文索引(5.6开始支持)。
Memory全表锁,存储在内存当中,速度快,但是占用的数据量成正比的内存空间,且数据在mysql重启时会丢失。
建议一般业务都使用innodb,如要支持全文索引和执行效率高考虑myisam和memory。
1.2 分表方法
在数据库变使用过程中,为减少数据库服务器的负担、缩短查询时间,常常会考虑做分表设计。分表分两种,一种是纵向分表(将本来可以在同一个表的内容,人为划分存储为多张表中)和横向分表(把大的表结构,横向切割同样结构的不同表)。
1、纵向分表主要解决以下问题
- 表与表之间资源争用的问题;
- 锁争用机率小;
- 实现核心与非核心的分级存储,如UDB登录库拆分为一级二级三级库;
- 解决了数据库同步压力的问题;
2、横向分表主要解决以下问题:
- 单表过大造成的性能问题;
- 单表过大造成的单服务器的问题;
1.3 索引问题
索引是对数据库表中一个或多个列的值进行排序的结构,建立索引有助于更快地获取信息。
mysql有四种不同的索引类型:
- 主键索引(primary)
- 唯一索引(unique)
- 普通索引(Index)
- 全文索引(fulltext)
建立索引的目的是加快对表中记录的查找或排序,索引也并非越多越好,因为创建索引是要付出代价的:一、增加数据库的存储空间;二、在插入和修改数据时要花费较多的时间维护索引。
在设计表或索引时,常出现以下几个问题:
- 少建索引或不建索引。
- 索引滥用。
- 不考虑联合索引,实际上联合索引的效率要比单列索引的效率高。
- 非最优列选择。
二、慢 SQL 问题

2.1 导致慢 SQL 的原因
在遇到慢 SQL 情况时,不能简单的把原因归结为 SQL 编写问题(虽然这是最常见的因素),实际上导致慢 SQL 有很多因素,甚至包括硬件和 mysql 本身的 bug。根据出现的概率从大到小,罗列如下:
SQL编写问题

业务实例相互干绕对 IO/CPU 资源争用
服务器硬件
MYSQL BUG

2.2 由 SQL 编写导致的慢 SQL 优化
针对SQL编写导致的慢 SQL,优化起来还是相对比较方便的。正如上一节提到的正确的使用索引能加快查询速度,那么我们在编写 SQL 时就需要注意与索引相关的规则:
字段类型转换导致不用索引,如字符串类型的不用引号,数字类型的用引号等,这有可能会用不到索引导致全表扫描;
mysql 不支持函数转换,所以字段前面不能加函数,否则这将用不到索引;
不要在字段前面加减运算;
字符串比较长的可以考虑索引一部份减少索引文件大小,提高写入效率;
like % 在前面用不到索引;
根据联合索引的第二个及以后的字段单独查询用不到索引;
不要使用 select *;
排序请尽量使用升序 ;
or 的查询尽量用 union 代替 (Innodb);
复合索引高选择性的字段排在前面;
order by / group by 字段包括在索引当中减少排序,效率会更高。

除了上述索引使用规则外,SQL 编写时还需要特别注意一下几点:
尽量规避大事务的 SQL,大事务的 SQL 会影响数据库的并发性能及主从同步;
分页语句 limit 的问题;
删除表所有记录请用 truncate,不要用 delete;
不让 mysql 干多余的事情,如计算;
输写 SQL 带字段,以防止后面表变更带来的问题,性能也是比较优的 ( 涉及到数据字典解析,请自行查询资料);
在 Innodb上用 select count(*),因为 Innodb 会存储统计信息;
慎用 Oder by rand()。

三、分析诊断工具

在日常开发工作中,我们可以做一些工作达到预防慢 SQL 问题,比如在上线前预先用诊断工具对 SQL 进行分析。常用的工具有:
mysqldumpslow
mysql profile
mysql explain
具体使用及分析方法在此就不赘述,网上有丰富的资源可以参考。

四、误操作、程序 bug 时怎么办

提出这个问题显然主要是针对刚开始工作的年轻同行们……实际上误操作和程序 bug 导致数据误删或者混乱的问题并非少见,但是刚入行的开发工作者会比较紧张。一个成熟的企业往往会有完善的数据管理规范和较丰富的数据恢复方案(初创公司除外),会进行数据备份和数据容灾。

当你发现误操作或程序 bug 导致线上数据被误删或误改动时,一定不能慌乱,应及时与 DBA 联系,第一时间进行数据恢复(严重时直接停止服务),尽可能减少影响和损失。对于重要数据(如资金)的操作,在开发时一定要反复进行测试,确保没有问题后再上线。

Mysql数据库设计及常见问题相关推荐

  1. 不属于mysql常量的是_MySQL中,下面______常量的写法是不正确的?-智慧树MySQL数据库设计与应用章节答案...

    MySQL数据库设计与应用:MySQL中,下面______常量的写法是不正确的?[?ж???] A:'2.1E5 B:0x123abc C:b'121' D:null MySQL数据库设计与应用章节测 ...

  2. mysql数据库设计的原则_MySQL数据库设计原则

    转自 http://www.supidea.com/post/mysql_design_database.aspx MySQL数据库设计原则 MySQL对于成为一个非常快速的数据库服务器有着当之无愧的 ...

  3. MYSQL数据库设计原则

    一.MYSQL数据库设计原则 1.核心原则 不在数据库做运算; cpu计算务必移至业务层; 控制列数量(字段少而精,字段数建议在20以内); 平衡范式与冗余(效率优先:往往牺牲范式) 拒绝3B(拒绝大 ...

  4. 数据库-优化-MYSQL数据库设计原则

    MYSQL数据库设计原则 1.核心原则 不在数据库做运算; cpu计算务必移至业务层; 控制列数量(字段少而精,字段数建议在20以内); 平衡范式与冗余(效率优先:往往牺牲范式) 拒绝3B(拒绝大sq ...

  5. mysql数据库设计原则_mysql数据库设计总结

    作者:腾讯云技术社区 链接:https://www.zhihu.com/question/19719997/answer/154809252 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权, ...

  6. mysql数据库慕课答案_智慧树MySQL数据库设计与应用慕课答案

    智慧树MySQL数据库设计与应用慕课答案 更多相关问题 [单选] TDD-LTE中一个子帧包含()时隙, [多选] 调整天线下倾角可以改变:() [单选] 多级破碎时,总破碎比等于多机破碎比的(). ...

  7. mysql函数包含的意思_MySQL存储函数的特性说明中,______表示函数体不包含SQL语句。-智慧树MySQL数据库设计与应用章节答案...

    MySQL数据库设计与应用:MySQL存储函数的特性说明中,______表示函数体不包含SQL语句.[?????] A:containssql B:modifiessqldata C:nosql D: ...

  8. mysql数据库设计与应用答案智慧树_智慧树MySQL数据库设计与应用完整免费答案...

    智慧树MySQL数据库设计与应用完整免费答案 更多相关问题 [问答题,简答题] 保育员在教师组织教育活动时应做哪些配合工作? [填空题] 幼儿园的安全教育包括防火.防触电.放走失.防烫伤.防食物.防摔 ...

  9. 互联网产品mysql数据库设计总结

    mysql数据库性能不比oracle数据库,所以设计上,和oracle有一些不同.下面总结一些互联网产品的数据库设计. 1.主键 主键可以使用bigint(20) unsigned也可以使用varch ...

最新文章

  1. Android Handler杂记(结合别人的blog)
  2. Chrome反压缩JS代码:Pretty Print显示可读代码
  3. Coursera吴恩达《卷积神经网络》课程笔记(2)-- 深度卷积模型:案例研究
  4. UDP协议下内网与公网IP进行发送消息,一对多.且选择不同的客户端发送消息
  5. 在linux下配置java,在Linux下配置Java开发环境
  6. PHP----学生管理系统
  7. [css] 实现单行文本居中和多行文本左对齐并超出显示“...“
  8. python contains类似函数_五步教会你用python爬虫神器PyQuery!(内含详细步骤和代码)...
  9. 韩顺平php视频笔记71 面向对象编程的三大特征2 访问修饰符 继承
  10. 基于JavaWeb的房屋出租管理系统设计与实现
  11. 【GIS】开源GIS简介
  12. [视频基础]流媒体码流、分辨率、采样率、比特率、gop、qp、fps、cvbr概念理解
  13. chipsel语言_英语快速记忆法视频
  14. 计算机网络实验三 rdt协议
  15. IDEA中HTML文档快速制作table表格快捷键方法
  16. 微信小程序的的图片显示不出来
  17. 【数据分析自学】一、系统认识数据分析
  18. BWAPP靶场-HTML injection-Reflected(POST)
  19. 一点点对WebResource.axd的配置及使用[原创]
  20. Android WebRTC语音视频通话demo

热门文章

  1. 收取承兑汇票四大注意事项
  2. 采购订单增强(根据公司代码、采购订单类型等相关订单信息给采购订单税码设置默认值)
  3. SAP SD模块几个透明表
  4. Sap权限相关设置、控制及传输
  5. 狄德罗效应下,小程序被“逼”向中心化
  6. android wm 改变大小,Android 屏幕适配经验总结
  7. 编写函数,可以接收任意多个整数并输出其中的最大值和所有整数之和。
  8. flutter 代码仓库_go-flutter开发桌面应用(二) 创建go-flutter插件
  9. springwebflux 页面_Spring Webflux 响应式框架入门
  10. vue ui框架_你为什么要使用前端框架Vue?