问题
库表设计
慢 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