当前位置:Gxlcms > mysql > 《高性能MySQL》读书笔记_MySQL

《高性能MySQL》读书笔记_MySQL

时间:2021-07-01 10:21:17 帮助过:26人阅读

《High Performance MySQL》真是本经典好书,从应用层到数据库到硬件平台,各种调优技巧、常见问题全都有所提及。数据库的各种概念技巧平时都有接触,像索引、分区、Sharding等等,但要想真正提高还是得如此系统学习一下。
Chapter 1: MySQL Architecture and History
1.1 Transaction Isolation Level
1.2 Implicit and Explicit Locking
使得事务具有较高的并发度,因为解锁不必发生在事务结尾。它的不足是没有解决死锁的问题,因为它在加锁阶段没有顺序要求。如两个事务分别申请了A, B锁,接着又申请对方的锁,此时进入死锁状态。
1.3 Multiversion Concurrency Control
Innodb只是借了MVCC这个名字,提供了读的非阻塞而已。
Chapter 4: Optimizing Schema and Data Types
4.1 Choosing Optimal Data Types
Smaller is usually better(越小通常越好):因为占用更少磁盘空间,内存以及CPU缓存,所以越小通常代表越快。Simple is good(简单的就是好的):因为字符集和排序规则(Collation)使得字符串的比较很复杂,所以我们应当用Integer等内建类型而非字符串来保存日期时间或IP地址。Avoid NULL if possible(尽可能避免NULL):MySQL对NULL有特殊的处理逻辑,所以NULL会使索引、索引统计、值比较都变得更加复杂。4.2 Using ENUM Instead Of A String Type
4.3 Cons of A Normalized Schema
JOIN使我们无法通过一个索引就同时完成排序和过滤。改为非规范化 => SELECT .. FROM user_message WHERE account_type = 'premium' ORDER BY published DESC LIMIT 10则(account_type, published)上的索引能高效地完成任务!
这几种技术本质上都是为了加速查询操作,但代价是拖慢了写操作,并且会增加开发的复杂度。
4.5 Materialized Views
4.6 Counter Tables
ps:如果需要每天刷新计数器的话,那么建表时就加入时间列:CREATE TABLE daily_hit_counter( day date not null, slot tinyint unsigned not null primary key, cnt int unsigned not null, primary key(day, slot)) ENGINE=InnoDB;
pss:如果不想每天都插入初始数据的话,可以用下面的SQL:mysql> INSERT INTO daily_hit_counter(day, slot, cnt) VALUES(CURRENT_DATE, RAND() * 100, 1) ON DUPLICATE KEY UPDATE cnt = cnt + 1;
psss:如果想减少计数器的行数来节约空间,那么可以执行一个定期任务来合并所有记录到Slot 0:
5.1 B-Tree Family
各种变形的核心是围绕着内结点出度(例如基于内存的T树和基于磁盘的B树)、存储使用率(B树和B+树)等方面进行的。
3次磁盘IO操作和3次内存查找操作。关于内存中的文件名查找,由于是一个有序表结构,可以利用折半查找提高效率。至于IO操作是影响整个B树查找效率的决定因素。当然,如果我们使用平衡二叉树的磁盘存储结构来进行查找,磁盘4次,最多5次,而且文件越多,B树比平衡二叉树所用的磁盘IO操作次数将越少,效率也越高。

人气教程排行