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

1、少建索引或不建索引。这个问题最突出,建议建表时 DBA 可以一起协助把关。

2、索引滥用。滥用索引将导致写请求变慢,拖慢整体数据库的响应速度(5.5 以下的 mysql 只能用到一个索引)。

3、从不考虑联合索引。实际上联合索引的效率往往要比单列索引的效率更高。

4、非最优列选择。低选择性的字段不适合建单列索引,如 status 类型的字段。

二、慢 SQL 问题

2.1 导致慢 SQL 的原因

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

1、SQL编写问题

2、锁

3、业务实例相互干绕对 IO/CPU 资源争用

4、服务器硬件

5、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 联系,第一时间进行数据恢复(严重时直接停止服务),尽可能减少影响和损失。对于重要数据(如资金)的操作,在开发时一定要反复进行测试,确保没有问题后再上线。