mysql数据库开发常见问题及优化

mysql 数据库是被广泛应用的关系型数据库,其体积小、支持多处理器、开源并免费的特性使其在 Internet 中小型网站中的使用率尤其高。在使用 mysql 的过程中不规范的 SQL 编写、非最优的策略选择都可能导致系统性能甚至功能上的缺陷。
    

恰巧就在前几天,本人所在公司的云事业部举办了一场关于 mysql 的技术交流会,其中一个 part 正是聚焦于开发过程中 mysql 数据库设计及使用的常见问题,并提出相关优化方案。根据会议内容并查阅相关资料,本人对这个 part 进行了一次小结,结合自己的工作经历及理解形成此文以供分享,希望能有助于各位同行解决工作中的相关问题。

本文将就以下三个问题进行展开:

    1. 库表设计
    2. 慢 SQL 问题
    3. 误操作、程序 bug 时怎么办

一、库表设计

1.1 引擎选择

在 mysql 5.1 中,引入了新的插件式存储引擎体系结构,允许将存储引擎加载到正在运新的 mysql 服务器中。使用 mysql 插件式存储引擎体系结构,允许数据库专业人员或者设计库表的软件开发人员为特定的应用需求选择专门的存储引擎,完全不需要管理任何特殊的应用编码要求,也无需考虑所有的底层实施细节。因此,尽管不同的存储引擎具有不同的能力,应用程序是与之分离的。此外,使用者可以在服务器、数据库和表格三个层级中存储引擎,提供了极大的灵活性。

mysql 常用的存储引擎包括 MYISAM、Innodb 和 Memory,其中各自的特点如下:

    1. MYISAM : 全表锁,拥有较高的执行速度,一个写请求请阻塞另外相同表格的所有读写请求,并发性能差,占用空间相对较小,mysql 5.5 及以下仅 MYISAM 支持全文索引,不支持事务。
    2. Innodb:行级锁(SQL 都走索引查询),并发能力相对强,占用空间是 MYISAM 的 2.5 倍,不支持全文索引(5.6 开始支持),支持事务。
    3. Memory : 全表锁,存储在内存当中,速度快,但会占用和数据量成正比的内存空间且数据在 mysql 重启时会丢失。

基于以上特性,建议绝大部份都设置为 innodb 引擎,特殊的业务再考虑选用 MYISAM 或 Memory ,如全文索引支持或极高的执行效率等。

1.2 分表方法

在数据库表使用过程中,为了减小数据库服务器的负担、缩短查询时间,常常会考虑做分表设计。分表分两种,一种是纵向分表(将本来可以在同一个表的内容,人为划分存储在为多个不同结构的表)和横向分表(把大的表结构,横向切割为同样结构的不同表)。

其中,纵向分表常见的方式有根据活跃度分表、根据重要性分表等。其主要解决问题如下:

    1. 表与表之间资源争用问题;
    2. 锁争用机率小;
    3. 实现核心与非核心的分级存储,如UDB登陆库拆分成一级二级三级库;
    4. 解决了数据库同步压力问题。

横向分表是指根据某些特定的规则来划分大数据量表,如根据时间分表。其主要解决问题如下:

    1. 单表过大造成的性能问题;
    2. 单表过大造成的单服务器空间问题。

1.3 索引问题

索引是对数据库表中一个或多个列的值进行排序的结构,建立索引有助于更快地获取信息。 mysql 有四种不同的索引类型:

    1. 主键索此 ( PRIMARY )
    2. 唯一索引 ( UNIQUE )
    3. 普通索引 ( INDEX )
    4. 全文索引(FULLTEXT , MYISAM 及 mysql 5.6 以上的 Innodb )

建立索引的目的是加快对表中记录的查找或排序,索引也并非越多越好,因为创建索引是要付出代价的:一是增加了数据库的存储空间,二是在插入和修改数据时要花费较多的时间维护索引。

在设计表或索引时,常出现以下几个问题:

    1. 少建索引或不建索引。这个问题最突出,建议建表时 DBA 可以一起协助把关。
    2. 索引滥用。滥用索引将导致写请求变慢,拖慢整体数据库的响应速度(5.5 以下的 mysql 只能用到一个索引)。
    3. 从不考虑联合索引。实际上联合索引的效率往往要比单列索引的效率更高。
    4. 非最优列选择。低选择性的字段不适合建单列索引,如 status 类型的字段。

二、慢 SQL 问题

2.1 导致慢 SQL 的原因

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

    1. SQL编写问题
    2. 业务实例相互干绕对 IO/CPU 资源争用
    3. 服务器硬件
    4. MYSQL BUG

2.2 由 SQL 编写导致的慢 SQL 优化

针对SQL编写导致的慢 SQL,优化起来还是相对比较方便的。正如上一节提到的正确的使用索引能加快查询速度,那么我们在编写 SQL 时就需要注意与索引相关的规则:

    1. 字段类型转换导致不用索引,如字符串类型的不用引号,数字类型的用引号等,这有可能会用不到索引导致全表扫描;
    2. mysql 不支持函数转换,所以字段前面不能加函数,否则这将用不到索引;
    3. 不要在字段前面加减运算;
    4. 字符串比较长的可以考虑索引一部份减少索引文件大小,提高写入效率;
    5. like % 在前面用不到索引;
    6. 根据联合索引的第二个及以后的字段单独查询用不到索引;
    7. 不要使用 select *;
    8. 排序请尽量使用升序 ;
    9. or 的查询尽量用 union 代替 (Innodb);
    10. 复合索引高选择性的字段排在前面;
    11. order by / group by 字段包括在索引当中减少排序,效率会更高。

除了上述索引使用规则外,SQL 编写时还需要特别注意一下几点:

    1. 尽量规避大事务的 SQL,大事务的 SQL 会影响数据库的并发性能及主从同步;
    2. 分页语句 limit 的问题;
    3. 删除表所有记录请用 truncate,不要用 delete;
    4. 不让 mysql 干多余的事情,如计算;
    5. 输写 SQL 带字段,以防止后面表变更带来的问题,性能也是比较优的 ( 涉及到数据字典解析,请自行查询资料);
    6. 在 Innodb上用 select count(*),因为 Innodb 会存储统计信息;
    7. 慎用 Oder by rand()。

三、分析诊断工具

在日常开发工作中,我们可以做一些工作达到预防慢 SQL 问题,比如在上线前预先用诊断工具对 SQL 进行分析。常用的工具有:

    1. mysqldumpslow
    2. mysql profile
    3. mysql explain

具体使用及分析方法在此就不赘述,网上有丰富的资源可以参考。

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

提出这个问题显然主要是针对刚开始工作的年轻同行们……实际上误操作和程序 bug 导致数据误删或者混乱的问题并非少见,但是刚入行的开发工作者会比较紧张。一个成熟的企业往往会有完善的数据管理规范和较丰富的数据恢复方案(初创公司除外),会进行数据备份和数据容灾。当你发现误操作或程序 bug 导致线上数据被误删或误改动时,一定不能慌乱,应及时与 DBA 联系,第一时间进行数据恢复(严重时直接停止服务),尽可能减少影响和损失。对于重要数据(如资金)的操作,在开发时一定要反复进行测试,确保没有问题后再上线。

时间: 2024-12-31 01:29:45

mysql数据库开发常见问题及优化的相关文章

PHP+mysql数据库开发类似百度的搜索功能:中英文分词+全文检索(MySQL全文检索+中文分词(SCWS))

PHP+mysql数据库开发类似百度的搜索功能:中英文分词+全文检索 中文分词: a)   robbe PHP中文分词扩展: http://www.boyunjian.com/v/softd/robbe.html i.  Robbe完整版本下载:Robbe完整版本(PHP测试程序, 开发帮助文档, WinNT下php各版本的dll文件)下载: http://code.google.com/p/robbe(“谷歌”无法使用) b) SCWS(简易中文分词) 基于HTTP/POST的分词 : htt

MySQL数据库开发学习教程

MySQL数据库开发学习教程 一.数据库设计 数据库设计(一)--数据库设计http://blog.51cto.com/9291927/2087925 二.MySQL数据库开发基础教程 MySQL数据库开发基础教程目录如下: MySQL数据库基础(一)--MySQL数据库简介http://blog.51cto.com/9291927/2087947MySQL数据库基础(二)--MySQL字符集与乱码解析http://blog.51cto.com/9291927/2088254MySQL数据库基础

(DBA之路十)《深入浅出MySQL数据库开发优化与管理维护》的读书笔记

1>mysql的配置文件在/etc下的my.cnf 2)mysql服务是一系列后台进程,mysql数据库是一系列数据目录和数据文件 mysql数据库必须在mysql服务启动之后才可以进行访问 3)查看mysql服务的状态: netstat -nlp 4)启动/关闭服务 cd /usr/bin ./mysqld_safe & mysqladmin -uroot shutdown 5)PRM包安装的启动/关闭服务 service mysql start service mysql restart

传播知识,分享快乐--MySQL数据库开发与优化视频

?? 今天是9月11日,是一个值得纪念的日子,为无辜逝去的生命祈祷! 今年自开博以来整整六周年了,在广大网友的鼎力支持与协助下,博客写满500篇了. 为答谢广大网友的厚爱,本着传播知识,分享的理念,录制了MySQL开发与性能优化视频. 因时间关系,视频还未彻底完成,因此后续将继续完成全部录制工作. 以下为分享链接,欢迎大家拍砖及吐槽. http://pan.baidu.com/s/1pJux9eN 版权声明:本文为博主原创文章,未经博主允许不得转载.

《深入浅出MySQL数据库开发、优化于管理维护》基础篇学习笔记

MySQL数据库物理文件默认存放位置:C:\ProgramData\MySQL\MySQL Server 5.5\data\MySQL通过配置my.int的datadir属性来指定数据库的物理存放位置. 一.DDL语句:1.创建数据库:create database test; 2.删除数据库:drop database test; 3.描述表:desc emp; 4.删除表:drop table emp; 5.修改表:(1)修改表类型:alter table emp modify ename

微信开发 BAE运平台和java语音,微信mysql数据库开发实例 --图文开发教程

持续更新中 BAE java开发mysql数据库 图文教程 BAE java语言开发mysql源代码下载: 目前微信开发.BAE开发.java开发.mysql开发的教程很多,但是没有一个详细的介绍基于BAE平台.java语言和mysql数据库的微信开发教程.所以写了该教程,希望能给大家一点启发. 教程分为: 1.申请BAE账户: 2.在BAE平台建立web服务器应用: 3.在BAE平台建立mysql数据库服务器应用: 4.使用eclipse开发基于BAE平台的处理微信消息的web服务器系统: 5

高性能可扩展MySQL数据库设计及架构优化 电商项目

第1章 数据库开发规范的制定    俗话说:"没有规矩不成方圆".这一章,我们就先来制定数据库开发的各种规范,包括:数据库命名规范.数据库基本设计规范.数据库索引设计规范.数据库字段设计规范.SQL开发规范以及数据库操作规范.通过这些规范的制定可以指导并规范我们后续的开发工作,为我们以后的工作提供一个良好的基础.... 第2章 电商实例数据库结构设计    数据库开发规范的基础之上,如何更好的利用规范设计出易于维护和伸缩性良好的数据库结构,是我们的学习目的.这一章我们根据常用电商项目需

MySQL数据库索引常见问题

笔者看过很多数据库相关方面的面试题,但大多数答案都不太准确,因此决定在自己blog进行一个总结. Q1:数据库有哪些索引?优缺点是什么? 1.B树索引:大多数数据库采用的索引(innoDB采用的是b+树).能够加快访问数据的速度,尤其是范围数据的查找非常快.缺点是只能从索引的最左列开始查找,也不能跳过索引中的列,如果查询中有某个列用到了范围查询,则右边所有列都无法使用索引优化查找. 2.哈希索引:基于哈希表实现.在MySQL中,只有Memory引擎显式的支持哈希搜索.哈希查找的速度非常快,但哈希

高性能可扩展MySQL数据库设计及架构优化 电商项目_1

一 数据库设计规范 1 命名规范 所有数据库对象名称必须用小写字母并下划线分割 对象名称禁止使用MySQL保留关键字 命名要做到见名识义,不超过32字节 临时表必须tmp前缀 日期后缀 备份库表bak前缀 日期后缀 所有存储相同数据的列名和类型必须一致 2 数据库基本设计规范 所有表必须用innodb引擎 数据库和表字符集同意使用utf8(全存储中文的可以使用gbk 或是gbk2312) 所有表和字段都使用comment加注释 从一开始就进行数据字典的维护 尽量控制单表数据量的大小 建议500万