0
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,476

Published on

mysql

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,476
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
13
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Transcript of "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性能调优与架构设计》
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×