高性能MySQL(第二版)


  • mysql

    • 命令

      • 操纵命令

        • DDL(Data Definition language)
          • create
            • create table tablename(字段名1 类型, 字段2 类型) charset=utf8 engine=innodb;
            • create database databasename default charset=charsetName
          • alter
            • index
              • alter table tablename add index indexname(字段名1,字段名2...);
              • alter table tablename add index indexname(字段名(5));
            • table
              • alter column
              • modify column
              • change column
            • 分区表
              • alter table tablename partition by key<primary key> (partition p0 data directory='/tmp/p0', partition p1 data directory='/tmp/p1');)
                • directory不能为表定义或者数据存放的目录
              • alter table tablename partition by(range(year(date))) (partition p_2007 values less than(2007), partition p_2008 values less than(2008), partition p_leftall values less than maxvalue);
          • drop
            • drop table tablename;会删除表的结构
          • truncate
            • truncate table tablename;只会删除表的数据,而不会删除表的结构
        • DML(Data Manipulation Language)
          • Select
          • Insert
          • Update
            • 不带where clause很危险
          • Delete
            • Delete from tablename;同truncate语句,但是效率不及它,因为delete是一条一条记录删除
            • delete from tablename where 字段=xx;
          • Call
            • call procedure_demo();
          • Explain
            • explain select * from tablename;
          • flush
            • flush privileges;
            • flush tables with read lock;
          • lock
            • lock tables tablename write; .....; unlock tables;
            • flush tables with read lock;....; unlock tables;
        • DCL(Data Control Language)
          • Grant
            • grant [privileges] on [objects] to [user]
            • grant [privileges] on [objects] to [user] identified by [password];
            • grant all privileges on *.* to 'root'@'localhost' indentified by '123456' with grant option;
          • revoke
            • revoke [privileges] on [objects] from [user];
          • deny
          • 事务
            • commit
            • rollback
      • 显示附加信息命令

        • 请查询information_schema模式中的信息
        • 表结构
          • desc tablename
          • explain tablename
          • show columns from tablename
        • 表信息
          • show table status like tablename
        • 设置信息
          • show variables;
          • show global variables;
          • show global status;
        • 索引信息
          • show index from tablename
        • select信息
          • explain select .....
          • explain extended select .....; show warnings;
          • explain partitions select ....;
        • 性能信息
          • set profiling = 1; 
            -- sql manipulations; 
            show profiles; 
            show profile all[cpu, block io, ipc, memory, context switches, swaps, source, page faults] for query num;
        • 日志信息
          • show master logs;
          • show master status;
          • show slave status;
          • show binary logs;
        • 用户信息
          • 关闭匿名用户
            • mysql_secure_installation
          • use mysql; select * from user;
          • show grants for 'root'@'localhost';
        • 线程信息
          • show processlist;
          • show full processlist;
        • 引擎信息
          • show engine innodb status;
    • 类型

      • 特点

        • 数据类型越小越快,越简单越好。[cpu]
        • 慷慨是一种可耻
      • Blob 与 Text

          • 存储大数据
          • 都有各自的数据类型家族,
            字符类型有tinytext, smalltext, text, mediumtext,
            二进制类型有tinyblob, smallblob, blob, mediumblob, longblob;
          • blob等同于smallblob,text等同于smalltext
          • Blob没有字符集和排序规则
          • Text有字符集和排序规则
      • Enum

        • Enum存储的是数字,select enum列+0 from tablename;会看到是数字
        • Enum和varchar链接时很耗时
        • 排序是按照数字排序的,如果要按规定的排序,可以使用FIELD()显示的排序;
          select e from tablename order by field(e, 'apple', 'banana', 'pear');
      • SET

        • 内部采用数字存储,在比较时使用字符串,同Enum
        • Enum一次只能选择一个,而SET可以存储多个
      • 字符串

        • 避免使用字符串来做标识符,因为他们占用了很多空间并且通常比整数类型要慢。
        • 不要在MyISAM表上使用字符串标识符,因为使用了压缩索引(Packed Index),这使查找更缓慢
      • 时间类型

        • DATETIME
          • 从1001年到9999年,精度为秒
        • date
          • 从1001到9999年
        • TIMESTAMP
          • 默认是not null,和其它数据都不一样
          • 4字节,存储空间只有DATETIME的一半
          • 没有显示赋值,会自动根据现在时间赋值更新,一个表中只有一个会随update而自动更新
          • 从1970/1/1-7:00 到 2038年,精度为秒
          • 提供from_unixtime()和unix_timestamp()两个函数
      • 索引

        • 帮助MySQL高效获取数据的数据结构
        • MySQL只能高效地搜索索引的最左前缀(Leftmost Prefix),所以如果索引了多列数据,那么列的顺序非常重要
        • 类型
          • B-Tree
          • Hash
            • 目前只有MEMORY和NDB CLUSTER支持
          • 空间:R-Tree
            • 只支持GEOMETRY这样的地理空间数据类型
          • 全文索引:fulltext
            • 只有MyISAM支持
            • 建议使用外部搜索引擎如Lucene或者Sphinx来实现,效果和性能更好
        • 高性能索引策略
          • 聚簇索引:clustered
            • 不是一种单独的索引类型,而是一种存储数据的方式
            • 目前只有innodb和solidDB支持
          • 覆盖索引: covering index
            • 包含所有满足查询需要的数据的索引
            • 只能使用B-Tree索引来覆盖查询
            • explain中extra列中using index表示使用的是覆盖索引
          • 索引维护很消耗资源[insert, update, delete操作]
      • 排序

        • 文件排序:filesort
          • 双路排序
          • 单路排序
            • 如果需要进行排序的列的总大小加上order by列的总大小超过了max_length_for_sort_data就会使用双路排序
            • 减少了I/O读取次数,消耗更多的内存
            • MySQL 4.1及以后版本支持
        • 使用索引排序:
          • explain中type列中index
        • 表级锁
        • 行级锁
        • MVCC(MultiVersion Concurrency Control)
          • 一种行级锁,各个数据库实现不同

      • 隔离级别

        • read uncommitted(读取未提交内容)-- 脏读
        • read committed(读取提交内容)--其它数据库默认级别
        • repeatable read(可重复读,会导致幻读--使用间隙锁防止)--默认
        • serialiable(串行)
        • 设置隔离级别: set session transaction isolation level read committed
      • 例程(routines)

        • 存储函数(function)
        • 存储过程(procedure)
        • 触发器(trigger),是特殊的存储过程。
        • 事件(Event)
          • 周期性的任务
      • 日志

        • 二进制日志(mysql-bin.log)
          • 类型
            • statement
            • row
            • mixed
          • 设置
            • 启动时设置参数 --binlog-format = type
            • set Global binlog_format = 'type'
            • set session binlog_format='type'
        • 慢日志(mysql-slow.log)
          • 分析查询慢的语句
        • 清理日志
          • 对于Mysql4.1以后版本: [cron]
            0 0 * * * /usr/bin/find /var/log/mysql -mtime +N -name "mysql-bin.[0-9]*" | xargs rm
          • 0 0 * * * /usr/bin/mysql -e "PURGE MASTER LOGS BEFORE CURRENT_DATE - INTERVAL N DAY";
          • expire_logs_days
            • show variables like "expire_logs_days";
      • 引擎

        • .FRM结构保存表的结构
        • myisam
          • 表级锁
          • 不支持事务
          • 数据分为两个文件:数据文件(.MYD)和索引文件(.MYI)
        • innodb
          • mvcc行级锁
          • 支持事务
          • innodb将所有数据共同存储在一个或者几个数据文件中(ibdata1,ibdata2...日志文件为两个ib_logfile0, ib_logfile1),
            这种数据文件一般叫做表空间,本质是一种黑盒,在黑盒里innodb自我管理一切数据。
          • innodb_data_home_dir=/var/lib/mysql/ innodb_data_file_path=ibdata1:1G;ibdata2:1G;ibdata3:1G[ :autoextend:max:4G ]
    • 函数

      • ip地址

        • ip地址转整数: INET_ATON(string)
        • 整数转ip地址:INET_NTOA(string)
      • 加密

        • MD5(string)
        • SHA1(string)
        • Encrypt(string)
        • 谨慎使用password(),各个版本会不同
        • @encypted :=AES_Encrypt(string, @key) 解密:aes_decypt(@encypted, @key)
      • FIELD()
      • FIND_IN_SET()
      • find_rows()
      • 类型转换

        • cast : cast(enumT as char)
        • convert: convert(string using gbk)
      • 基准测试:benchmark()

      • 时间

        • 将unix时间擢转换为日期; from_unixtime(int)
        • 将日期转换为unix时间擢: unix_timestamp(string)
        • date("2013-06-08 22:49:30")
        • year(upstring);
        • month(upstring);
        • week(upstring);
        • day(upstring)
        • time(upstring)
        • 当前时间擢:current_timestamp()
        • 当前时间: curtime()
        • 当前日期: curdate()
        • 当前日期时间: now()
        • 当前日期常量: current_date
        • 当前时间常量: current_time
        • 加运算: date_add(current_timestamp(), interval 10 day)
        • 减运算:date_sub(current_date, interval 10 day)
        • 日期格式转换
          • 字符串转换为日期: str_to_date('2013-01-29 13:49:18', '%Y-%m-%d %H:%i:%s')
          • 日期转换为字符串: DATE_FORMAT('2013-01-29 13:49:18', '%Y-%m-%d %H:%i:%s')
      • 循环冗余校验码: crc32(string)
      • 列转行:GROUP_CONCAT([DISTINCT] expr [,expr ...] [ORDER BY {unsigned_integer | col_name | expr} [ASC | DESC] [,col_name ...]] [SEPARATOR str_val])
      • UUID()
    • 性能

      • 查询性能优化

        • 可能问题
          • 查询了太多数据
          • 数据访问方式
        • 典型错误
          • 提取超过需要的列
          • 多表联接时提取所有的列
          • 提取所有的列
        • 重构查询
          • 缩短查询
          • 分解联接
          • 子查询和联接
        • 优化联接
          • 确保ON或using列有索引
          • 确保group by或order by只引用一个表中的列
          • 谨慎升级MySQL
        • MySQL优化
          • 对联接中的表重新排序
          • 将外联接转化为内联接
          • 代数等价法则
          • 优化count(), MIN(), max()
        • 优化特定类型的查询
          • 优化count
            • count(columnName)
            • count(*),不会展开所有列,而是忽略所有列并统计行数
            • 统计不为NULL的列数
            • myisam引擎使用count(*)更快
          • 优化group by 和distinct
            • group by 与distinct的优化是一样的
            • 优化group by的策略
              • 临时表
                • 使用SQL_SMALL_RESULT强制选择临时表
              • 文件排序
                • 使用SQL_BIG_RESULT强制使用文件排序
          • 优化limit和offset
          • SQL_calc_found_rows
        • 查询优化提示
          • HIGH_PRIORITY
          • LOW_PRIORITY
          • DELAYED
            • 用于INSERT和UPDATE
          • straight_join
            • 用于select语句中或者联接语句
          • SQL_SMALL_RESULT和SQL_BIG_RESULT
          • SQL_BUFFER_RESULT
            • 告诉优化器将结果放在临时表中,并且尽快释放掉表锁
          • sql_cache 和sql_no_cache
          • sql_calc_found_rows
            • found_rows()获得得到的行数
          • for update和lock in share mode
          • use index, ignore index和force index
        • 硬件与操作系统
          • 多CPU和核心
            • 真正派上用场的地方是在线事务处理系统(OLTP)
      • 配置

        • 每个联接优化
          • set @@session.sort_buffer_size = 1024*1024*1024; 
            --some sql management; 
            set @@session.sort_buffer_size=default;
          • set @tmp_session_sort_buffer_size = @@session.sort_buffer_size; 
            set @@session.sort_buffer_size=1024*1024;
            -- some sql management;
            set @@session.sort_buffer_size = @tmp_session_sort_buffer_size; -- 重新将值设置为原先的值
      • 分离功能

        • 在线事务处理(OLTP)
        • 在线分析处理(OLAP)
      • 备份与还原

        • 方式
          • 裸备份
            • 好处
              • 备份简单
              • 恢复简单
              • 往往跨平台
              • 恢复速度更快,不需要执行任何SQL语句,也不需要重建索引
          • 逻辑备份
            • 工具通常为:mysqldump
            • 好处
              • 文本形式
              • 兼容性强
              • 独立于特定的存储引擎
              • 避免数据损坏
            • 坏处
              • 服务器必须亲自生成它,会使用更多的CPU周期
              • 浮点数精度丢失问题
              • 文件可能会比原来数据文件更大
                • 数据库中的数据存储格式更紧凑
            • 方式
              • mysqldump database [table] > table.sql
              • 以CSV格式导出
                select * into outfile "words.csv" 
                fields terminated by ',' optionally enclosed by '"' 
                from test.words;
                • 存储更小
        • 两者配合
          • 先做一个裸副本,然后开启一个MySQL服务器,在副本基础上生成逻辑备份。
          • 有文件系统快照的功能,更方便
        • 备份内容
          • 被忽视的数据
            • 日志类
            • 配置类文件
              • 数据库配置信息
              • 服务器的配置信息
            • 与其相关的操作系统文件
              • cron任务
              • 用户和组配置
              • 管理脚本
              • sudo规则
          • 代码
            • 存储过程和触发器等
        • 增量备份
          • 定期做增量备份
          • 方法
            • 备份二进制日志。
              • 最简单,使用最广泛,最适合的途径
            • rdiff 和rdiff-backup命令
        • 完全备份
          • 简单
        • 还原
          • mysql -uroot -p database < database.sql
          • set sql_log_bin = 0;source database.sql; set sql_log_bin = 1
          • set sql_log_bin = 0;load data infile 'table.sql' into table test.table; set sql_log_bin=1;
      • 复制

        • 复制不是备份,只会扩展读取,不会扩展写入
        • 原则
          • 一个MySQL从服务器只能有一个主服务器
          • 每个从服务器有唯一的服务器ID
          • 一个主服务器可以有很多从服务器
        • 复制方式
          • 查看mysql读取的是哪个配置文件
            • 查看mysqld目录:which mysqld;
            • /usr/sbin/mysqld --verbose --help | grep -A 1 "Default options"
          • 命令复制
            • 执行语句重放
          • 行复制
            • 执行结果存储
        • 模式
          • 主-从
          • 主-主
          • 主-被
          • 带从服务器的主主模式
          • 环(多个主)
          • 分发服务器(黑洞存储引擎)
      • 伸缩性和高可用性

        • 术语
          • 性能
            • 应用满足某一目标的能力
            • 比如预计的响应时间和吞吐量
          • 负载能力
            • 应用能处理的总负载
          • 伸缩性
            • 应用通过各种方式(比如增加服务器)增大时,它能够继续保持原来性能的能力
            • 就是在不降低性能的情况下,给应用增加负载量的能力
          • 可用性
            • 应用响应请求时间的百分比,通常用“几个9”表示
          • 容错性
            • 应用和整个系统从容的处理错误故障的能力。
            • 当它宕机时,一个具有容错性的应用能够尽可能地提供系统的原有功能,好过彻底不可用
            • 跟自我修复能力不是一回事
          • 有一个医院,每天能够医治病人数为10人·「性能」,
            极限情况下为30人。·「总负载能力」,
            当春天来临时,病人数猛增,这时为了保持每天医治10人,他们就得增加医生的数量。·「伸缩性」,
            在工作时间内,你去看医生,医生有0.001%刚好正在厕所,在的时间为99.999%·「可用性」,
            如果医院的放射科设备瘫痪了,那么医院的其它科室,照常工作,不受它的影响。·「容错性」
        • 扩展方式
          • 垂直扩展
          • 水平扩展
          • 回缩
            • 把很少或者不在使用的数据归档或者清除
        • 准备工作
          • 性能优化
            • 开启查询日志,分析运行缓慢的查询
          • 购买性能更强的硬件设备
          • 向上扩展
            • 升级
            • 不建议
              • 费用
              • 服务器有性能极限(如读写性能极限)
          • 向外扩展
            • 集群


后面的章节看了但是没有做笔记,主要内容还是集中在前面3,4,5章。

 感想一点点

      虽然MySQL被Oracle收购了,未来不知道是什么样的,但是这本书还是讲到了很多数据库方面不失一般性的知识,如索引,而且浅一点的就是可以解决实际问题,本书没有什么练习题,但是'开源中国社区最新讨论话题',就是练习之地,基本每天都有人问数据库方面的问题,刚开始还真不知道怎么回答他们,但是后来把问题带到书本上去看,把问题定位,想想就有那么一点点思路了。深一点的很多优秀的东西还是值得去研究,如索引,事务,还有他们处理问题的思路。

 疑问一点点:

       1. 有时恢复test数据,使用下面的命令没有任何作用,只会在终端中显示test.sql的内容,有时又可以。

 $ mysql -uroot -p123456 test < test.sql
       2. 内存使用问题,当mysql本身使用内存[除了系统和其它应用的内存]过大时,mysql服务器会直接崩溃。为什么它不能控制,可以怠慢,但是也不至于反应那么激励吧。[速度慢点好过崩溃吧]

       3. in子查询问题,http://www.oschina.net/question/874453_114400 ,说明MySQL现在这个版本的优化器有问题,还未看源码,向@justin_cn 学习 ,带着问题深入源码研究。

       4. 不支持CTE's,不过还好可以用联接代替。


「使用freemind做读书笔记,但是导出为图片也不好,导出为flash很好,但是要插件,无法弄上来。还是Html吧。」


你可能感兴趣的:(高性能MySQL(第二版))