SQL优化整理(一)

基于mysql数据库

一、库表设计

1.1引擎选择

MySQL常用的存储引擎包括MyISAM、InnoDB和Memory,其中各自的特点如下:
1、MyISAM:全表锁,拥有较高的执行速度,一个写请求阻塞另外相同表格的所有读写请求,并发性能差,占用空间相对较小,MySQL5.5及以下仅MyISAM支持全文索引,不支持事物
2、InnoDB:行级锁(SQL都走索引查询),并发能力相对强,占用空间是MyISAM的2.5倍,不支持全文索引(5.6开始支持),支持事物。
3、Memory:全表锁,存储在内存当中,速度快,但会占用和数据量成正比的内存空间且数据在MySQL重启时会丢失
基于以上特性,建议绝大部分都设置为InnoDB引擎,特殊的业务再考虑选用MyISAM或Memory,如全文索引支持或极高的执行效率等

1.2分表方法

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

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

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

横向分表是指根据某些特定的规则来划分大数据量表,如根据时间分表。其主要解决问题如下:
- 单表过大造成的性能问题;
- 单表过大造成的单服务器空间问题

1.3索引问题

索引是对数据库表中一个或多个列的值进行排序的结构,建立索引有助于快速获取信息。

mysql有四种不同的索引

  • 主键索引(PRIMARY)
  • 唯一索引(UNIQUE)
  • 普通索引(INDEX)
  • 全文索引(FULLTEXT,MyISAM及MySQL5.6以上的InnoDB)

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

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

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

    二、慢SQL问题

    2.1导致慢SQL的原因

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

    • SQL编写问题
    • 业务实例相互干扰对IO/CPU资源争用
    • 服务器硬件
    • MySQL Bug

2.2、由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会存储统计信息;
  • 慎用Order by rand()。

    三、分析诊断工具

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

  • mysql dumpslow

  • mysql profile
  • mysql explain

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

一个成熟的企业往往会有完善的数据管理规范和较丰富的数据恢复方案,会进行数据备份和数据容灾。当你发现误操作或程序bug导致线上数据被误删或误改动时,一定不能慌乱,应及时与DBA联系,第一时间进行数据恢复(严重时直接停止服务),尽可能减少影响和损失。对于重要数据(如资金)的操作,在开发时一定要反复进行测试,确保没有问题后再上线。

原文转载自作者:cyfonly

猜你喜欢

转载自blog.csdn.net/sinat_37464123/article/details/80915377
今日推荐