MySQL数据库是一种应用广泛的关系型数据库。其体积小、支持多处理器、开源和免费的特性使其在中小型Internet站点中特别受欢迎。在使用MySQL的过程中,不规范的SQL编写和非最优的策略选择可能会导致系统性能甚至功能缺陷。 恰好前几天,我公司云事业部召开了一个关于MySQL的技术交流会。其中一个部分着重介绍了MySQL数据库在开发过程中设计和使用中的常见问题,并提出了相关问题。优化。根据会议内容和查阅相关资料,本人对这部分内容进行了总结,并结合自己的工作经验和理解,形成本文进行分享,希望能帮助各位同事解决工作中的相关问题。本文将围绕以下三个问题进行展开:1.数据库表设计2.慢SQL问题3.误操作和程序bug怎么办1.数据库表设计1.1引擎选择在mysql5.1中,新的插件存储引入了EngineArchitecture,它允许将存储引擎加载到正在交付的新mysql服务器中。使用mysql插件存储引擎架构,数据库专业人员或设计库表的软件开发人员可以针对特定的应用程序需求选择专用的存储引擎,而无需管理任何特殊的应用程序编码需求,也无需考虑所有底层实现细节。因此,虽然不同的存储引擎具有不同的能力,但应用程序与它们是分离的。此外,用户可以将引擎存储在服务器、数据库和表三个层次,提供了极大的灵活性。mysql常用的存储引擎有MYISAM、Innodb和Memory,它们各自的特点如下:1.MYISAM:全表锁,执行速度快,一个写请求应该阻塞同一张表的所有其他读写请求,并且并发性能较差,占用空间较小,mysql5.5及以下版本只有MYISAM支持全文索引,不支持事务。2.Innodb:行级锁(所有SQL都使用索引查询),并发性比较强,占用空间是MYISAM的2.5倍,不支持全文索引(5.6开始支持),支持事务。3、内存:全表锁,存储在内存中,速度快,但会占用与数据量成正比的内存空间,mysql重启时数据会丢失。基于以上特点,建议大部分设置为innodb引擎,特殊服务需要考虑MYISAM或者Memory,比如全文索引支持或者执行效率极高。1.2分表法在使用数据库表的过程中,为了减轻数据库服务器的负担,缩短查询时间,往往会考虑分表设计。分表有两种,一种是垂直分表(本来可以在同一张表中的内容被人为分割存储在多个不同结构的表中)和水平分表(大表结构被裁剪)水平进入结构的相同不同表)。其中,垂直表分类常用的方法有基于活跃度和重要性的表分类。其主要问题如下:1.表间资源争用;2、锁竞争概率低;3、实现核心和非核心分层存储,如UDB登录库拆分为一级库、二级库和三级库;4.解决了数据库同步压力的问题。水平分表是指按照一定的特定规则对数据量大的表进行分表,比如时间表分表。主要解决以下问题:1.单表过大导致的性能问题;2、单表过大导致的单台服务器空间问题。1.3索引问题索引是一种对数据库表中一个或多个列的值进行排序的结构,建立索引有助于更快地获取信息。mysql有四种不同的索引类型:1、主键索引(PRIMARY)2、唯一索引(UNIQUE)3、普通索引(INDEX)4、全文索引(mysql5.6以上的FULLTEXT、MYISAM和Innodb)建立索引的目的是为了加快表中记录的查找或排序,索引越多越好,因为创建索引是有代价的:一是增加数据库的存储空间,二是插入的时候要花更多的时间和修改数据。时间维护指标。在设计表或索引时,经常会出现以下问题:1、少建索引或不建索引。这个问题最为突出。建议DBA可以帮忙一起查表。2.索引滥用。滥用索引会拖慢写请求,拖慢整个数据库的响应速度(5.5以下的mysql只能使用一个索引)。3.从不考虑联合索引。事实上,联合索引的效率往往高于单列索引。4.非最优列选择。选择性低的字段不适合建单列索引,比如status类型的字段。2.SQL慢的问题2.1SQL慢的原因在SQL慢的情况下,不能简单地将原因归结为SQL编写的问题(虽然这是最常见的因素)。其实导致SQL变慢的因素有很多,甚至包括Hardware和mysql本身的bug。按照出现的概率,罗列如下:1.SQL写问题2.锁3.业务实例相互干扰,争抢IO/CPU资源4.服务器硬件5.MYSQLBUG2.2SQL导致的慢写SQL优化针对写SQL导致的慢SQL,优化起来相对方便。上一节讲到,正确使用索引可以加快查询速度,所以我们在写SQL的时候需要注意索引相关的规则:1.字段类型转换导致不建立索引,比如不带引号的string类型,number类型使用引号等,可能不会使用索引,导致全表扫描;2、mysql不支持函数转换,所以字段前不能加函数,否则索引将无法使用;3.不要在字段前面进行加减运算;4.如果字符串比较长,可以考虑部分索引,减少索引文件的大??小,提高写入效率;5.like%不使用前面的索引;6、根据联合索引的第2个及后续字段单独查询,不使用索引;7、不要使用select*;8、请尽量使用升序排序;9、尝试使用union代替orquery(Innodb);10、综合指标选择性高的领域排名第一;11.orderby/groupby字段被包含在索引中,减少排序,效率会更高。除了以上索引使用规则外,在编写SQL时还需要特别注意以下几点:1、尽量避免大事务的SQL,会影响数据库的并发性能和主从同步;2.分页语句限制问题;3、请使用truncate而不是delete来删除表中的所有记录;4、不要让mysql做多余的事情,比如计算;5、带字段输入写SQL,防止后续改表带来的问题,性能比较好(涉及到数据字典分析,请自行查询资料);6、在Innodb上使用selectcount(*),因为Innodb会存储统计信息;7.谨慎使用Oderbyrand()。3、分析诊断工具在日常的开发工作中,我们可以做一些预防慢SQL问题的工作,比如在上线前用诊断工具对SQL进行预分析。常用的工具有:1.mysqldumpslow2、mysqlprofile3、mysqlexplain具体的使用和分析方法这里就不多说了,网上有丰富的资源可以参考。4、出现误操作和程序错误怎么办这个问题显然主要是针对刚入职的年轻同事...其实,误操作和程序错误导致数据被删除或混淆的情况并不少见。会更紧张。一个成熟的企业往往拥有完备的数据管理规范和丰富的数据恢复方案(初创公司除外),会进行数据备份和数据容灾。当您发现由于误操作或程序bug导致线上数据被误删除或更改时,千万不要惊慌,应及时联系DBA,尽快恢复数据(严重时直接停止服务),从而将影响和损失降到最低。对于重要数据(比如资金)的操作,在开发的时候一定要反复测试,确保没有问题才可以上线。
