Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
MySQL
目录 应用开发 优化 架构
应用开发 SQL 关键字 数据读取(备份) 过程、函数、事件、视图、触发器 用户权限 加密技术 SQL 注入 监控 管理维护
SQL 关键字   SELECT/FROM/JOIN/WHERE   GROUP BY/HAVING/ORDER BY/LIMIT   表达式    SELECT uid,(SELECT max(player_level)    FROM...
数据读取       逻辑       Mysqldump       select ... into outfile       mysql < backup.sql       load data infile       my...
用户       建立用户       create user ‘huangk’@‘localhost’ identified by        ‘root’;       drop user huangk;       用户信息  ...
权限   查看权限    show privileges;    show grants for usename@hostname;   授予权限    grant privileges(all: 所有权限 usage :没有权限 )   ...
权限   更新权限    flush privileges;    执行后,对访问权限做出的改变才会生效   回收权限    revoke privileges    on dbname.tablename    from username...
数据表维护   修复 MyISAM 文件    myisamchk [options] tablename1   压缩 MyISAM 文件    myisampack [options] tablename1   查看信息    mysq...
数据表维护   检查或维护 MyISAM 表    CHECK TABLE    REPAIR TABLE   优化 MyISAM 表    OPTIMIZE TABLE   分析 MyISAM 表    ANALYZE TABLE
移动数据库目录   把 MySQL 服务进程停掉    mysqladmin -uroot -proot shutdown   移动目录    mv -r /var/lib/mysql /home/mysql   编辑 MySQL 的配置...
移动数据库目录   移动数据目录后 , 权限发生变化,需要设    置 mysql 组用户具有权限    chown -R mysql:mysql /home/mysql    chmod mysql+x /home/mysql   重新启...
优化 目标 系统设计 参数配置 SQL 语句
目标 减少 I/O ,磁盘 I/O 转到内存 I/O 降低 CPU 运算 优先优化高并发的 SQL EXPLAIN SET PROFILING=1 SHOW PROFILE
系统设计 表结构(横表 or 竖表) 数据类型 数据编码 引擎(物理文件) 索引 锁 日志文件 Replication 文件 参数文件
表结构 竖表容易扩展内容,但不够直观 竖表对字段的不同内容,无法设置权限(数据库权限粒度最小到字段) 横表使结构一目了然。 横表扩展起来要修改表数据结构,亚历山大
表结构 适度冗余 表保留玩家帐号、等级、流派等分析常用的维度 大字段垂直分拆或整合 用 blob 类型保存玩家的 profile ,有数据需求时再 提取出来做深入的分析 大表水平分拆 任务 物品变化 统计汇总表 银两产出
数据类型 数字类型  DOUBLE 、 DECIMAL 慎用  unsigned TINYINT/INT/BIGINT 字符类型  char  varchar: 长度不同, MySQL 不同的存储处理  text LOB 类型  保留许多...
数据类型 时间类型  TIMESTAMP 类型,其存储空间只需要 DATETIME 类型   的一半。  DATE 类型,存储空间只需要 3 个字节,比 TIMESTAMP   还少。  INT 类型类存储一个 unix timesta...
数据编码 不同的字符集 -> 不同的存储空间 ->I/O UTF8 或 UNICODE 字符 规范对象命名   sql 语句的所有表名、字段名全部小写,系统保留字、内置函数名    、 sql 保留字大写   Select/From/...
引擎 MyISAM InnoDB
MyISAM 引擎 索引缓存优化 key_buffer_size :索引缓存大小 key_buffer_block_size : key_cache_division_limit : key_cache_age_threshold : 多 k...
InnoDB 引擎 索引缓存  Innodb_buffer_pool_*  Innodb_log_buffer_size 事务优化  innodb_flush_log_at_trx_commit 数据存储
InnoDB 引擎 两次写 double write  skip_innodb_doublewrite: 禁止两次写功能,  可能发生写失效问题 插入缓冲 insert buffer 自适应哈希索引  自动根据访问的频率和模式来为某些页建...
InnoDB 引擎 表空间    每张表都有个主键。如果不指定,如果表中有  非空的唯一索引,则该列为主键,否则自动创建  一个 6 字节大小的指针。    每个表单独一个表空间,存放的只是数据、索  引、插入缓冲信息;撤销信息、系统事务信息...
InnoDB 引擎       页       数据页 B-tree Node       Undo 页 Undo Log Page       系统页 System Page       事务数据页 Transaction syst...
InnoDB 引擎   行记录格式    Compact 行记录格式    Redundant 行记录格式    行溢出数据    Compressed 行记录格式    Dynamic 行记录格式
事务 脏读 ( 事务没提交,提前读取 ) :脏读就是指当一个事务正在 访问数据,并且对数据进行了修改,而这种修改还没有提交到 数据库中,这时,另外一个事务也访问这个数据,然后使用了 这个数据。 不可重复读 ( 两次读的不一致 ) :是指在一...
事务 read uncommitted read committed prpeatable read serializable
索引 B-Tree 索引 Hash 索引 Full-Text 索引    将字段数据进行分割后再进行索引 R-Tree 索引
锁 行级锁定( row-level )  InnoDB  NEXT-KEY LOCKING 间隙锁的锁实现方式,会锁定    不存在的键值 表级锁定( table-level )  MyISAM  Table_locks_% 表级锁定参数...
锁 缩短锁定时间,减少锁定的资源量 复杂的 query 拆成几个小 query 进行 尽量控制事务大小 提高并发度 concurrent_insert 读写优先级设置 low_priority_updates
日志文件 错误日志 Error log  show variables like log_error‘ 查询日志 query log  5.1 后 mysql.general_log 表中
日志文件 二进制日志 binary log 所有修改数据库数据的 QUERY 语句,事务安全 mysqlbinlog 工具 默认二进制日志不启动。开启这个选项可能有性 能下降 sync_binlog: 磁盘同步间隔事务数 binlog_cac...
日志文件 二进制日志 binary log binlog_format:statement 、 row 、 mixed binlog_do_db binlog_ignore_db binlog_cache_use: 记录用缓冲写二进制日志次 ...
日志文件 慢查询日志 slow query log  mysqlslowdump 慢查询日志工具  log_queries_not_using_indexes:on/off  long_query_time :记录执行时间超过多长的  que...
参数配置   Cache   buffer   memory   IO   swap   cpu   connection   thread   query cache   table cache
query cache Hash 运算及查找资源消耗 Query cache 失效问题 缓存 Result Set :一条记录可能多次缓存 have_query_cache Query_cache* :参数变量 Qcache* : ...
connection max_connections: 最大连接数 max_user_connnections :每个用户允许的最大连  接数 net_buffer_length: 网络传输效率 max_allowed_packet: ...
query table cache :文件描述符 sort_buffer_size :排序时使用的 buffer join_buffer_size :
SQL 语句 只 select 需要的数据字段,减少网络和内存  数据传输量 避免在条件中对索引做函数转换 避免使用不等于条件 like 操作以通配符 ( 如’ %data’) 开始,无法  使用索引
SQL 语句 Join  Nested loop join :通过驱动表的结果集作为循环  基础数据,然后将结果集中的数据作为过滤条件一  条条地到下一个表中查询数据,最后合并结果 order by  索引排序  排序算法     取出排序...
SQL 语句 Group by  1 、松散索引     group by 条件字段位于同一个索引最前面位  置     只能用 max 和 min 两个聚合函数  2 、紧凑索引  3 、临时表 Distinct  与 group by ...
SQL 语句 Union  尽量 union all 而不去重 Limit  join 表之前可以过滤数据量 Count  count(*) 优于 count(1)  count(column) 是表示结果集中有多少个  column 字...
架构 分层 分表 复制 集群 Cache 与 search
参考文献 《MySQL性能调优与架构设计》
Upcoming SlideShare
Loading in …5
×

mysql总结

1,729 views

Published on

mysql

Published in: Technology
  • Be the first to comment

mysql总结

  1. 1. MySQL
  2. 2. 目录 应用开发 优化 架构
  3. 3. 应用开发 SQL 关键字 数据读取(备份) 过程、函数、事件、视图、触发器 用户权限 加密技术 SQL 注入 监控 管理维护
  4. 4. SQL 关键字 SELECT/FROM/JOIN/WHERE GROUP BY/HAVING/ORDER BY/LIMIT 表达式 SELECT uid,(SELECT max(player_level) FROM levelup WHERE levelup.uid = player.uid AND levelup.t_when <= player.t_when) AS level FROM player In/exists
  5. 5. 数据读取 逻辑  Mysqldump  select ... into outfile  mysql < backup.sql  load data infile  mysql import 物理  MyISAM : hotcopy  InnoDB : ibbackup
  6. 6. 用户 建立用户  create user ‘huangk’@‘localhost’ identified by ‘root’;  drop user huangk; 用户信息  rename ‘huangk’@‘localhost’ to ‘huangk’@‘192.***.***.***’  update user set password=PASSWORD(‘select’) where user=‘huangk’
  7. 7. 权限 查看权限 show privileges; show grants for usename@hostname; 授予权限 grant privileges(all: 所有权限 usage :没有权限 ) on dbname.tablename to username@hostname with grant option
  8. 8. 权限 更新权限 flush privileges; 执行后,对访问权限做出的改变才会生效 回收权限 revoke privileges on dbname.tablename from username@hostname
  9. 9. 数据表维护 修复 MyISAM 文件 myisamchk [options] tablename1 压缩 MyISAM 文件 myisampack [options] tablename1 查看信息 mysqlshow 服务器管理 mysqladmin
  10. 10. 数据表维护 检查或维护 MyISAM 表 CHECK TABLE REPAIR TABLE 优化 MyISAM 表 OPTIMIZE TABLE 分析 MyISAM 表 ANALYZE TABLE
  11. 11. 移动数据库目录 把 MySQL 服务进程停掉 mysqladmin -uroot -proot shutdown 移动目录 mv -r /var/lib/mysql /home/mysql 编辑 MySQL 的配置文 件 /etc/mysql/my.cnf [mysqld] socket = /home/mysql/mysqld.sock datadir = /home/mysql log_bin = /home/mysql/mysqlbin.log
  12. 12. 移动数据库目录 移动数据目录后 , 权限发生变化,需要设 置 mysql 组用户具有权限 chown -R mysql:mysql /home/mysql chmod mysql+x /home/mysql 重新启动 MySQL 服务 /etc/init.d/mysql start
  13. 13. 优化 目标 系统设计 参数配置 SQL 语句
  14. 14. 目标 减少 I/O ,磁盘 I/O 转到内存 I/O 降低 CPU 运算 优先优化高并发的 SQL EXPLAIN SET PROFILING=1 SHOW PROFILE
  15. 15. 系统设计 表结构(横表 or 竖表) 数据类型 数据编码 引擎(物理文件) 索引 锁 日志文件 Replication 文件 参数文件
  16. 16. 表结构 竖表容易扩展内容,但不够直观 竖表对字段的不同内容,无法设置权限(数据库权限粒度最小到字段) 横表使结构一目了然。 横表扩展起来要修改表数据结构,亚历山大
  17. 17. 表结构 适度冗余 表保留玩家帐号、等级、流派等分析常用的维度 大字段垂直分拆或整合 用 blob 类型保存玩家的 profile ,有数据需求时再 提取出来做深入的分析 大表水平分拆 任务 物品变化 统计汇总表 银两产出
  18. 18. 数据类型 数字类型 DOUBLE 、 DECIMAL 慎用 unsigned TINYINT/INT/BIGINT 字符类型 char varchar: 长度不同, MySQL 不同的存储处理 text LOB 类型 保留许多不常用的字段信息
  19. 19. 数据类型 时间类型  TIMESTAMP 类型,其存储空间只需要 DATETIME 类型 的一半。  DATE 类型,存储空间只需要 3 个字节,比 TIMESTAMP 还少。  INT 类型类存储一个 unix timestamp 的值,不直观, 会给维护带来不必要的麻烦 ENUM & SET  使用 ENUM 来存放状态字段,即使需要增加新的 类型,只要增加于末尾,修改结构也不需要重 建表数据。  使用 SET 类型存放可预先定义的属性数据。
  20. 20. 数据编码 不同的字符集 -> 不同的存储空间 ->I/O UTF8 或 UNICODE 字符 规范对象命名  sql 语句的所有表名、字段名全部小写,系统保留字、内置函数名 、 sql 保留字大写  Select/From/Where/Order by/Group by/limit 等子句必须另 其一行写  在 T-SQL 代码中为字符常量使用单引号 , 避免使用双引号
  21. 21. 引擎 MyISAM InnoDB
  22. 22. MyISAM 引擎 索引缓存优化 key_buffer_size :索引缓存大小 key_buffer_block_size : key_cache_division_limit : key_cache_age_threshold : 多 key cache key cache 的 Mutex key cache 预加载 表读取索引优化 read_buffer_size :顺序读数据 read_md_buffer_size :随机读数据
  23. 23. InnoDB 引擎 索引缓存 Innodb_buffer_pool_* Innodb_log_buffer_size 事务优化 innodb_flush_log_at_trx_commit 数据存储
  24. 24. InnoDB 引擎 两次写 double write skip_innodb_doublewrite: 禁止两次写功能, 可能发生写失效问题 插入缓冲 insert buffer 自适应哈希索引 自动根据访问的频率和模式来为某些页建立哈希 索引 innodb_adaptive_hash_index: 禁用或启动此 特性
  25. 25. InnoDB 引擎 表空间 每张表都有个主键。如果不指定,如果表中有 非空的唯一索引,则该列为主键,否则自动创建 一个 6 字节大小的指针。 每个表单独一个表空间,存放的只是数据、索 引、插入缓冲信息;撤销信息、系统事务信息、 二次写缓冲还是存放在原来的共享表空间内。 段 数据段 索引段
  26. 26. InnoDB 引擎 页  数据页 B-tree Node  Undo 页 Undo Log Page  系统页 System Page  事务数据页 Transaction system Page  插入缓冲位图页 Insert Buffer Bitmap  插入缓冲空闲列表页 Insert Buffer Free List  未压缩的二进制大对象页 Uncompressed BLOB Page  压缩的二进制大对象页 Compressed BLOB Page     
  27. 27. InnoDB 引擎 行记录格式 Compact 行记录格式 Redundant 行记录格式 行溢出数据 Compressed 行记录格式 Dynamic 行记录格式
  28. 28. 事务 脏读 ( 事务没提交,提前读取 ) :脏读就是指当一个事务正在 访问数据,并且对数据进行了修改,而这种修改还没有提交到 数据库中,这时,另外一个事务也访问这个数据,然后使用了 这个数据。 不可重复读 ( 两次读的不一致 ) :是指在一个事务内,多次读 同一数据。在这个事务还没有结束时,另外一个事务也访问该 同一数据。那么,在第一个事务中的两次读数据之间,由于第 二个事务的修改,那么第一个事务两次读到的的数据可能是不 一样的。这样就发生了在一个事务内两次读到的数据是不一样 的,因此称为是不可重复读。 幻读:是指当事务不是独立执行时发生的一种现象,例如第一 个事务对一个表中的数据进行了修改,这种修改涉及到表中的 全部数据行。同时,第二个事务也修改这个表中的数据,这种 修改是向表中插入一行新数据。那么,以后就会发生操作第一 个事务的用户发现表中还有没有修改的数据行,就好象发生了 幻觉一样。
  29. 29. 事务 read uncommitted read committed prpeatable read serializable
  30. 30. 索引 B-Tree 索引 Hash 索引 Full-Text 索引   将字段数据进行分割后再进行索引 R-Tree 索引
  31. 31. 锁 行级锁定( row-level ) InnoDB NEXT-KEY LOCKING 间隙锁的锁实现方式,会锁定 不存在的键值 表级锁定( table-level ) MyISAM Table_locks_% 表级锁定参数 页级锁定( page-level ) Innodb_row_lock_% 行级锁定参数
  32. 32. 锁 缩短锁定时间,减少锁定的资源量 复杂的 query 拆成几个小 query 进行 尽量控制事务大小 提高并发度 concurrent_insert 读写优先级设置 low_priority_updates
  33. 33. 日志文件 错误日志 Error log show variables like log_error‘ 查询日志 query log 5.1 后 mysql.general_log 表中
  34. 34. 日志文件 二进制日志 binary log 所有修改数据库数据的 QUERY 语句,事务安全 mysqlbinlog 工具 默认二进制日志不启动。开启这个选项可能有性 能下降 sync_binlog: 磁盘同步间隔事务数 binlog_cache_size: 事务过程中二进制日志 SQL 语句的缓存大小 max_binlog_cache_size:binlog 使用的最大 cache 内存大小
  35. 35. 日志文件 二进制日志 binary log binlog_format:statement 、 row 、 mixed binlog_do_db binlog_ignore_db binlog_cache_use: 记录用缓冲写二进制日志次 数 binlog_cache_disk_use: 记录用临时文件写二 进制次数,判断 binlog_cache_size 设置是否合 理
  36. 36. 日志文件 慢查询日志 slow query log mysqlslowdump 慢查询日志工具 log_queries_not_using_indexes:on/off long_query_time :记录执行时间超过多长的 query log_slow_queries:on/off 5.1 后 存放在 mysql.slow_log 表中 InnoDB 的在线 REDO 日志 InnoDB REDO log innodb_log_file_size innodb_log_files_in_group innodb_mirrored_log_groups innodb_log_group_home_dir
  37. 37. 参数配置 Cache buffer memory IO swap cpu connection thread query cache table cache
  38. 38. query cache Hash 运算及查找资源消耗 Query cache 失效问题 缓存 Result Set :一条记录可能多次缓存 have_query_cache Query_cache* :参数变量 Qcache* : query cache 的使用情况
  39. 39. connection max_connections: 最大连接数 max_user_connnections :每个用户允许的最大连 接数 net_buffer_length: 网络传输效率 max_allowed_packet: 一次消息传输量的最大值 back_log: 等待队列中允许存放的最大连接请求数 连接池 thread_cache_size :应该存放的连接线程数 thread_stack :每个连接线程被分配的内存大小
  40. 40. query table cache :文件描述符 sort_buffer_size :排序时使用的 buffer join_buffer_size :
  41. 41. SQL 语句 只 select 需要的数据字段,减少网络和内存 数据传输量 避免在条件中对索引做函数转换 避免使用不等于条件 like 操作以通配符 ( 如’ %data’) 开始,无法 使用索引
  42. 42. SQL 语句 Join Nested loop join :通过驱动表的结果集作为循环 基础数据,然后将结果集中的数据作为过滤条件一 条条地到下一个表中查询数据,最后合并结果 order by 索引排序 排序算法 取出排序字段以及相应行指针 取出排序字段以及所有字段 max_lenght_for_sort_data :决定算法问题 sort_buffer_size :减少数据分段、减少临时 表交换排序
  43. 43. SQL 语句 Group by 1 、松散索引 group by 条件字段位于同一个索引最前面位 置 只能用 max 和 min 两个聚合函数 2 、紧凑索引 3 、临时表 Distinct 与 group by 操作非常相似, group by 之后每 组中取出一条记录而已 distinct 并不需要排序
  44. 44. SQL 语句 Union 尽量 union all 而不去重 Limit join 表之前可以过滤数据量 Count count(*) 优于 count(1) count(column) 是表示结果集中有多少个 column 字段不为空的记录; count(*) 是表示整 个结果集有多少条记录
  45. 45. 架构 分层 分表 复制 集群 Cache 与 search
  46. 46. 参考文献 《MySQL性能调优与架构设计》

×