问题

  • 库表设计

  • 慢 SQL 问题

  • 误操作、程序 bug

  • 索引失效问题

引擎选择

常用的存储引擎 MyISAM、InnoDB 和 Memory

MyISAM:全表锁,较高的执行速度。一个写请求阻塞另外相同表格的所有读写请求,并发性能差,占用空间相对较小。MySQL 5.5 及以下,仅 MyISAM 支持全文索引,不支持事务。

InnoDB:行级锁(SQL 都走索引查询),并发能力相对强,占用空间是 MyISAM 的2.5 倍。不支持全文索引(5.6 开始支持),支持事务。

Memory:全表锁,存储在内存当中,速度快。但占用和数据量成正比的内存空间,且数据在 MySQL 重启时会丢失。

分表方法

为减小数据库服务器的负担、缩短查询时间,常会考虑做分表设计。

分表分两种:

1、纵向分表

将在同一个表的内容,划分存储在多个不同结构的表。

方式:根据活跃度分表,根据重要性分表

解决问题:

  • 表与表之间资源争用问题

  • 锁争用机率小

  • 核心与非核心的分级存储,如UDB登录库拆分成一级二级三级库

  • 数据库同步压力问题

2、横向分表

把大的表结构,横向切割为同样结构的不同表。

方式:根据某些特定的规则来划分大数据量表,如:根据时间分表

解决问题:

  • 单表过大造成的性能问题

  • 单表过大造成的单服务器空间问题

索引问题

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

MySQL 四种不同的索引类型:

  • PRIMARY KEY

  • UNIQUE KEY

  • INDEX

  • FULLTEXT(MyISAM,MySQL 5.6-InnoDB)

创建索引的代价:
(1)增加了数据库的存储空间;
(2)插入和修改数据时,要花费较多的时间维护索引

注意:

  • 根据具体应用情景,建立合适的索引

  • 考虑联合索引,联合索引效率往往比单列索引效率更高

  • 区分度不高的字段,不适合建单列索引,如 status, sex,type 类型的字段

慢 SQL

只分析 SQL 编写问题

导致索引不生效,而直接全表扫描的情况,导致查询慢:

1、字段类型转换,导致不用索引。如:字符串类型不用引号,数字类型的用引号。

2、字段前面不能加函数,MySQL 不支持函数转换

3、字段加减运算

4、like % 在前面不使用索引

5、联合索引的第二个及以后的字段,单独查询用不到索引

其他慢查询的情况:

6、使用了 select ,不要使用 select

7、排序尽量使用升序

8、or 查询尽量使用 union 代替(InnoDB)

9、复合索引,高选择性的字段排前面(联合索引与符合索引的区别是什么?)

10、order by/ group by 字段,包括在索引当中,减少排序

分析诊断工具

mysql dumpslow
mysql profile
mysql explain