Database Design
SQL 调优
SQL 调优与索引策略
SQL 调优是一个范围很广的话题,有很多相关的书可以作为参考。
利用基准测试和performance 分析来模拟和发现系统瓶颈很重要。
基准测试和 performance 分析可能会指引你到以下优化方案。
改进模式
- 为了实现快速访问,MySQL 在磁盘上用连续的块存储数据。
- 使用
CHAR类型存储固定长度的字段,不要用VARCHAR。CHAR在快速、随机访问时效率很高。如果使用VARCHAR,如果你想读取下一个字符串,不得不先读取到当前字符串的末尾。
- 使用
TEXT类型存储大块的文本,例如博客正文。TEXT还允许布尔搜索。使用TEXT字段需要在磁盘上存储一个用于定位文本块的指针。 - 使用
INT类型存储高达 2^32 或 40 亿的较大数字。 - 使用
DECIMAL类型存储货币可以避免浮点数表示错误。 - 避免使用
BLOBS存储实际对象,而是用来存储存放对象的位置。 VARCHAR(255)是以 8 位数字存储的最大字符数,在某些关系型 database 中,最大限度地利用字节。- 在适用场景中设置
NOT NULL约束来提高搜索 performance。
使用正确的索引
- 你正查询(
SELECT、GROUP BY、ORDER BY、JOIN)的列如果用了索引会更快。 - 索引通常表示为自平衡的 B 树,可以保持数据有序,并允许在对数时间内进行搜索,顺序访问,插入,删除操作。
- 设置索引,会将数据存在内存中,占用了更多内存空间。
- 写入操作会变慢,因为索引需要被更新。
- 加载大量数据时,禁用索引再加载数据,然后重建索引,这样也许会更快。
避免高成本的联结操作
- 有 performance 需要,可以进行非规范化。
分割数据表
- 将热点数据拆分到单独的数据表中,可以有助于 cache。
调优查询 cache
- 在某些情况下,查询 cache可能会导致performance 问题。