您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

《高性能MySQL》读书笔记_MySQL

2025/11/4 16:05:45发布7次查看
《high performance mysql》真是本经典好书,从应用层到数据库到硬件平台,各种调优技巧、常见问题全都有所提及。数据库的各种概念技巧平时都有接触,像索引、分区、sharding等等,但要想真正提高还是得如此系统学习一下。chapter 1: mysql architecture and history
1.1 transaction isolation level1.2 implicit and explicit locking使得事务具有较高的并发度,因为解锁不必发生在事务结尾。它的不足是没有解决死锁的问题,因为它在加锁阶段没有顺序要求。如两个事务分别申请了a, b锁,接着又申请对方的锁,此时进入死锁状态。1.3 multiversion concurrency controlinnodb只是借了mvcc这个名字,提供了读的非阻塞而已。chapter 4: optimizing schema and data types4.1 choosing optimal data typessmaller 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 type4.3 cons of a normalized schemajoin使我们无法通过一个索引就同时完成排序和过滤。改为非规范化 => select .. from user_message where account_type = 'premium' order by published desc limit 10则(account_type, published)上的索引能高效地完成任务!这几种技术本质上都是为了加速查询操作,但代价是拖慢了写操作,并且会增加开发的复杂度。4.5 materialized views4.6 counter tables from= hit_counter= int= not= null= primary= select= set= slot= strong= table= tinyint= unsigned= update= where=>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操作次数将越少,效率也越高。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product