- 浏览: 7933403 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (2425)
- 软件工程 (75)
- JAVA相关 (662)
- ajax/web相关 (351)
- 数据库相关/oracle (218)
- PHP (147)
- UNIX/LINUX/FREEBSD/solaris (118)
- 音乐探讨 (1)
- 闲话 (11)
- 网络安全等 (21)
- .NET (153)
- ROR和GOG (10)
- [网站分类]4.其他技术区 (181)
- 算法等 (7)
- [随笔分类]SOA (8)
- 收藏区 (71)
- 金融证券 (4)
- [网站分类]5.企业信息化 (3)
- c&c++学习 (1)
- 读书区 (11)
- 其它 (10)
- 收藏夹 (1)
- 设计模式 (1)
- FLEX (14)
- Android (98)
- 软件工程心理学系列 (4)
- HTML5 (6)
- C/C++ (0)
- 数据结构 (0)
- 书评 (3)
- python (17)
- NOSQL (10)
- MYSQL (85)
- java之各类测试 (18)
- nodejs (1)
- JAVA (1)
- neo4j (3)
- VUE (4)
- docker相关 (1)
最新评论
-
xiaobadi:
jacky~~~~~~~~~
推荐两个不错的mybatis GUI生成工具 -
masuweng:
(转)JAVA获得机器码的实现 -
albert0707:
有些扩展名为null
java 7中可以判断文件的contenttype了 -
albert0707:
非常感谢!!!!!!!!!
java 7中可以判断文件的contenttype了 -
zhangle:
https://zhuban.me竹板共享 - 高效便捷的文档 ...
一个不错的网络白板工具
1 mysql为单进程多线程的架构
2 查看当前数据库支持的引擎
show engines\G;
3 innodb的后台线程有7个,4个IO THREAD,1个MASTER THREAD,1个锁,1个错误监控线程。
show engine innodb status\G;
4 innodb 的内存组成:缓冲池,重做日志缓冲池,额外的内存池
show variables like 'innodb_buffer_pool_size'\G;(缓冲池)
show variables like 'innodb_log_buffer_size'\G;重做日志缓冲池,
show variables like 'innodb_additional_mem_pool_size'\G;
具体看缓冲池的方法:
show engine innodb status\G;
BUFFER POOL AND MEMORY
----------------------
Total memory allocated 385277496; in additional p
Buffer pool size 21632
Free buffers 21543
Database pages 89
Modified db pages 0
Pending reads 0
Pending writes: LRU 0, flush list 0, single page
Pages read 89, created 0, written 0
0.00 reads/s, 0.00 creates/s, 0.00 writes/s
No buffer poaol page gets since the last printout
分配的内存为21632(buffer pool size表示有多少个缓冲帧)*16(每个buffer frame为16K)/1024=338M,free表
示有多少空闲,database pages表示已使用多少个。modified db pages表示脏页的数量
5 master thread的工作原理不:每10秒合拼插入缓冲,不是每秒发生,而是判断当前IO压力去进行,INNODB会判断缓
冲池中的脏页比例(buf_get_modified_ratio_pct),如果有超过70%的,则刷100个脏页到磁盘,如果比例小过70%,则
刷新10%到磁盘
6 double write buffer:由两部分组成,一部分是内存中的double write buffer,大小为2MB,另外的是磁盘上
共享表空间上的连续的128个页,即两个区,大小同样为2MB,当缓冲池脏页更新时,不写磁盘,而是通过memcpy 函数
先COPY到内存中的double write buffer,然后再分2次,每次写1MB到共享表空间的物理磁盘上,然后再调用fsync函数
,同步磁盘。
show global status like 'innodb_dblwr%'\G;
如果innodb_dblwr_pages_writen:innodb_dblwr_writes远小于64:1,说明磁盘写入压力不高
7 MYSQL中的参数类型,可以设置为当前会话,也可以设置为整个周期
set read_buffer_size=524288;
查全局 select @@global.read.read_buffer_size\G;
查会话的 select @@sessionread.read_buffer_size\G;
8 慢查询日志:
注意,5.1开始,慢查询以毫秒来计算,
show variables like '%long%';
查看开关是否打开
show variables like 'long_slow_queries';
show variable like 'long_query_time';
可以设置一个开关,当开关ON时,如果SQL没用到索引,则把这个语句也记录下来
show variable like 'long_queries_not_using_indexs';
查看慢查询日志的记录:
mysqldumpslow xxxx.log
5.1开始可以啊慢查询的日志记录放到一张表中:
9 查询日志:记录了所有对数据库请求的信息,放在主机名.log文件中
10 二进制文件:
binlog_cache_size:所有未提交的二进制日志都会记录到缓存中,等事务提交时再将从缓冲中的写入到二进制日
志文件中,默认为32KB
5.1中,binlog_format参数,可以设置的值有statement(用传统方式记录日志),row(记录的是表的行更改情况
),如果设置ROW,可以设置read commited的事务隔离级别,有更好的性能,但磁盘空间增大很多。
1)查看二进制日志文件
mysqlbinlog --start-position=203 XXXX.00004
可以看到SQL语句
而如果设置了ROW后,必须要用
mysqlbinlog --vv --start-position=xxx 222.004这样看更清楚
11)
innodb的默认文件可以在innodb_data_file_path中设置
[mysqld]
innodb_data_file_path=/db/indabat1:2000m;/db2/innodb:autoextend
指定了用两个文件来组成表空间,最好这两个文件位于不同的磁盘上。
12) 重做日志文件,也有重做日志文件组的概念,跟ORACLE的差不多,可以设置多个组,每个组有两个文件,写完一
个再写另外一个。
查看重做日志文件组的方法:show variables like '%innodb%log%'\G;
13) innodb表也是由表空间,段,区,页,行。段由数据段,索引段,回滚段组成
区由64个连续的页组成,每个页16KB,每个区为1MB。每行最多放16KB/2-200行记录即7992行记录
14) COMPACT行记录的格式
变长字段长度列表 NULL标志位 记录头信息 列1数据 列2数据。。。
其中NULL值不占存储空间
15) 注意的是,mysql中的varchar65536长度是说所有varchar列的长度总和,如果超出了,则无法创建。
16) MYSQL中,比如对于NOT NULL字段,如果非要插入非法字段,默认是不提示错误的,要提示错误的话,
设置sql_mode,即:
set sql_mode='STRICT_TRANS_TABLES';
17 MYSQL 5.1中每张表可建6个触发器,目前只支持for each row的触发方式
18 MYSQL 5。1中的分区
RANGE分区,LIST,HASE分区,KEY分区,不论哪种分区,当表中有主键或唯一索引时,分区列必须是唯一索引
的一个组成部分。
1)RANGE分区
create table t(id int) partition by range(id)
( partition p0 values less than(10),partition p1 values less than(20));
查看分区信息:
select * from information_schema.partitions where table_schema=database() and tablename='t';
注意的是,优化器只能对year(),to_days(),to_second(),unix_timestamp进行优化,而象
year(date)*100+month(date)这些则不会优化。
2)LIST分区
离散值。
3)HASH分区
partition by hash(year(b))
4)mysql 5.5中,新增加了column分区,可以不一定象以前那样,都是整型的数据,
比如
partition p0 values less than ('2009-01-01');
分区作在OLAP上比较好,如果是OLTP上的话,除非对主键查询,否则其实会更慢,
有可能。
19) 二叉查找树:左子树比根小,右子数比根大;
平衡二叉树:任何结点的左右子树高度最大差为1
B+树中一般用旋转代替拆分,增加效率
聚集索引和辅助索引内部都是B+;
聚集索引:叶子结点中存放的是整张表的行记录;聚集索引的叶节点就是最终的数据节点,而非聚集索引的叶节
仍然是索引节点,但它有一个指向最终数据的指针。
20)innodb plugin开始,支持快速建立索引的方法,但只对辅助索引起效果,对主键的创建和删除还是需要重新建立
一张表,辅助索引的话,会加S锁;查看索引方法
show index from 表名
每列的含义:
non_unique:非唯一的索引
key_name:索引的名
seq_in_index:索引中该列位置
column_name:索引的列
collation:列以什么方式存储,B+树索引总是A
cardinality:表示索引中唯一的数目的估计值,如果非常小,要考虑是否建立索引
sub_part:是否是列的部分被索引,如果索引整个列,则该字段为NULL
packed:关键字如何被压缩,如果没被压缩,则为NULL
NULL:是否索引的列包含有null值,
index_type:索引的类型,INNODB 中都为B+
分析cardinality时,不大准确,要用analyse tables去多分析,值就准确了
2 查看当前数据库支持的引擎
show engines\G;
3 innodb的后台线程有7个,4个IO THREAD,1个MASTER THREAD,1个锁,1个错误监控线程。
show engine innodb status\G;
4 innodb 的内存组成:缓冲池,重做日志缓冲池,额外的内存池
show variables like 'innodb_buffer_pool_size'\G;(缓冲池)
show variables like 'innodb_log_buffer_size'\G;重做日志缓冲池,
show variables like 'innodb_additional_mem_pool_size'\G;
具体看缓冲池的方法:
show engine innodb status\G;
BUFFER POOL AND MEMORY
----------------------
Total memory allocated 385277496; in additional p
Buffer pool size 21632
Free buffers 21543
Database pages 89
Modified db pages 0
Pending reads 0
Pending writes: LRU 0, flush list 0, single page
Pages read 89, created 0, written 0
0.00 reads/s, 0.00 creates/s, 0.00 writes/s
No buffer poaol page gets since the last printout
分配的内存为21632(buffer pool size表示有多少个缓冲帧)*16(每个buffer frame为16K)/1024=338M,free表
示有多少空闲,database pages表示已使用多少个。modified db pages表示脏页的数量
5 master thread的工作原理不:每10秒合拼插入缓冲,不是每秒发生,而是判断当前IO压力去进行,INNODB会判断缓
冲池中的脏页比例(buf_get_modified_ratio_pct),如果有超过70%的,则刷100个脏页到磁盘,如果比例小过70%,则
刷新10%到磁盘
6 double write buffer:由两部分组成,一部分是内存中的double write buffer,大小为2MB,另外的是磁盘上
共享表空间上的连续的128个页,即两个区,大小同样为2MB,当缓冲池脏页更新时,不写磁盘,而是通过memcpy 函数
先COPY到内存中的double write buffer,然后再分2次,每次写1MB到共享表空间的物理磁盘上,然后再调用fsync函数
,同步磁盘。
show global status like 'innodb_dblwr%'\G;
如果innodb_dblwr_pages_writen:innodb_dblwr_writes远小于64:1,说明磁盘写入压力不高
7 MYSQL中的参数类型,可以设置为当前会话,也可以设置为整个周期
set read_buffer_size=524288;
查全局 select @@global.read.read_buffer_size\G;
查会话的 select @@sessionread.read_buffer_size\G;
8 慢查询日志:
注意,5.1开始,慢查询以毫秒来计算,
show variables like '%long%';
查看开关是否打开
show variables like 'long_slow_queries';
show variable like 'long_query_time';
可以设置一个开关,当开关ON时,如果SQL没用到索引,则把这个语句也记录下来
show variable like 'long_queries_not_using_indexs';
查看慢查询日志的记录:
mysqldumpslow xxxx.log
5.1开始可以啊慢查询的日志记录放到一张表中:
9 查询日志:记录了所有对数据库请求的信息,放在主机名.log文件中
10 二进制文件:
binlog_cache_size:所有未提交的二进制日志都会记录到缓存中,等事务提交时再将从缓冲中的写入到二进制日
志文件中,默认为32KB
5.1中,binlog_format参数,可以设置的值有statement(用传统方式记录日志),row(记录的是表的行更改情况
),如果设置ROW,可以设置read commited的事务隔离级别,有更好的性能,但磁盘空间增大很多。
1)查看二进制日志文件
mysqlbinlog --start-position=203 XXXX.00004
可以看到SQL语句
而如果设置了ROW后,必须要用
mysqlbinlog --vv --start-position=xxx 222.004这样看更清楚
11)
innodb的默认文件可以在innodb_data_file_path中设置
[mysqld]
innodb_data_file_path=/db/indabat1:2000m;/db2/innodb:autoextend
指定了用两个文件来组成表空间,最好这两个文件位于不同的磁盘上。
12) 重做日志文件,也有重做日志文件组的概念,跟ORACLE的差不多,可以设置多个组,每个组有两个文件,写完一
个再写另外一个。
查看重做日志文件组的方法:show variables like '%innodb%log%'\G;
13) innodb表也是由表空间,段,区,页,行。段由数据段,索引段,回滚段组成
区由64个连续的页组成,每个页16KB,每个区为1MB。每行最多放16KB/2-200行记录即7992行记录
14) COMPACT行记录的格式
变长字段长度列表 NULL标志位 记录头信息 列1数据 列2数据。。。
其中NULL值不占存储空间
15) 注意的是,mysql中的varchar65536长度是说所有varchar列的长度总和,如果超出了,则无法创建。
16) MYSQL中,比如对于NOT NULL字段,如果非要插入非法字段,默认是不提示错误的,要提示错误的话,
设置sql_mode,即:
set sql_mode='STRICT_TRANS_TABLES';
17 MYSQL 5.1中每张表可建6个触发器,目前只支持for each row的触发方式
18 MYSQL 5。1中的分区
RANGE分区,LIST,HASE分区,KEY分区,不论哪种分区,当表中有主键或唯一索引时,分区列必须是唯一索引
的一个组成部分。
1)RANGE分区
create table t(id int) partition by range(id)
( partition p0 values less than(10),partition p1 values less than(20));
查看分区信息:
select * from information_schema.partitions where table_schema=database() and tablename='t';
注意的是,优化器只能对year(),to_days(),to_second(),unix_timestamp进行优化,而象
year(date)*100+month(date)这些则不会优化。
2)LIST分区
离散值。
3)HASH分区
partition by hash(year(b))
4)mysql 5.5中,新增加了column分区,可以不一定象以前那样,都是整型的数据,
比如
partition p0 values less than ('2009-01-01');
分区作在OLAP上比较好,如果是OLTP上的话,除非对主键查询,否则其实会更慢,
有可能。
19) 二叉查找树:左子树比根小,右子数比根大;
平衡二叉树:任何结点的左右子树高度最大差为1
B+树中一般用旋转代替拆分,增加效率
聚集索引和辅助索引内部都是B+;
聚集索引:叶子结点中存放的是整张表的行记录;聚集索引的叶节点就是最终的数据节点,而非聚集索引的叶节
仍然是索引节点,但它有一个指向最终数据的指针。
20)innodb plugin开始,支持快速建立索引的方法,但只对辅助索引起效果,对主键的创建和删除还是需要重新建立
一张表,辅助索引的话,会加S锁;查看索引方法
show index from 表名
每列的含义:
non_unique:非唯一的索引
key_name:索引的名
seq_in_index:索引中该列位置
column_name:索引的列
collation:列以什么方式存储,B+树索引总是A
cardinality:表示索引中唯一的数目的估计值,如果非常小,要考虑是否建立索引
sub_part:是否是列的部分被索引,如果索引整个列,则该字段为NULL
packed:关键字如何被压缩,如果没被压缩,则为NULL
NULL:是否索引的列包含有null值,
index_type:索引的类型,INNODB 中都为B+
分析cardinality时,不大准确,要用analyse tables去多分析,值就准确了
发表评论
-
mybatis generator中的字段大小写生成问题
2017-10-22 19:35 11375mybatis generator插件中,如果 mysql数据 ... -
MySQL统计一个列中不同值的数量
2017-07-11 14:04 16284https://yiqiwuliao.com/post/mys ... -
mysql 1449 : The user specified as a definer ('root'@'%') does not exist 解决方法
2017-03-02 09:44 1790权限问题,授权 给 root 所有sql 权限 mysql ... -
几个不错的MYSQL 优化TIPS
2016-11-19 12:30 811图片来自http://imysql.com/的PDF分享 [ ... -
powerdesign 逆向ORACLE的坑
2016-09-27 17:08 569要注意的是,在WIN 64中,如果要用powerdesin 来 ... -
( 转)mysql中删除两条重复记录中的一条
2015-10-19 20:19 1330| id | createTime | labId | pub ... -
mysql中sql语句=,>的时候的索引设置
2015-05-02 12:27 1308在 https://www.percona.com/blog/ ... -
mysql中profile的使用
2015-04-30 11:11 2230mysql 的 sql 性能分析器主要用途是显示 sql 执行 ... -
mysql中的sql mode
2015-04-13 11:29 1151mysql sql mode小结 1 sql mode可以 ... -
PROCEDURE ANALYSE()为mysql提高性能提供建议
2015-04-02 16:37 1466procedure analyse();语法如下 select ... -
mongodb中意外退出的问题
2015-02-11 14:32 1340mongodb启动的时候,意外退出: Unclean shut ... -
mysql 5.5中保留字查询
2014-06-05 23:16 1487mysql 5.5中保留字查询 http://www.5is ... -
(转)oracle 临时表空间的增删改查
2014-03-18 12:44 1144oracle 临时表空间的增删改查 1、查看临时表空间 (d ... -
pl-sql developer安装
2014-02-07 09:16 1130一直都是机器本机上有oracle,所以装pl sql deve ... -
oracle中的nvl,nvl2等参数
2013-12-26 11:18 22831.nul函数将一个null值转换为一个实际的值。 数据类型可 ... -
Oracle中的ROWNUM rowid 以及MySQL中实现rownum功能类似的语句
2013-12-26 11:08 2362http://gong-10140.iteye.com/blo ... -
ORACLE XE版本的限制
2013-12-07 08:11 366910g中用户数据最大为4G, 11G中最大为11G,如果超出大 ... -
oracle中监控索引是否可用
2013-11-04 07:22 1075在oracle中,可以使用如下的方法监控索引是否可用: a ... -
mysql 5.6中的时间类型的新精度介绍
2013-10-28 09:33 8411留意到mysql 5.6中,可以使用select now(6) ... -
<<oracle索引技术》读书笔记1
2013-08-25 16:23 1326expert indexing in oracle datab ...
相关推荐
MySQL技术内幕InnoDB存储引擎-读书笔记.pdf
Mysql 的InnoDB引擎的相关笔记 1.0.MySQL架构到innoDB架构.md 1.1.0.InnoDB——简介.md 1.1.1.InnoDB——关键特性.md 1.2.0.InnoDB内存结构——缓冲池.md 1.2.1.InnoDB内存结构——log buffer.md 1.2.2.InnoDB内存...
最近在学习MySQL技术内幕 InnoDB存储引擎 第2版,整理了一些文档分享出来,同时也方便以后查看。若有不当之处,烦请批评指正。 1. MySQL体系结构和存储引擎 2. InnoDB存储引擎 2.1 InnoDB体系结构 2.2 ...
Mysql innodb存储引擎内幕,作者姜承旭
读书笔记:《高性能MySQL》《MySQL技术内幕InnoDB存储引擎》阅读笔记
与前一版相比,第2版不仅针对最新的MySQL 6对相关内容进行了全面的补充,还根据广大读者的反馈意见对第1版中存在的不足进行了完善,《MySQL技术内幕:InnoDB存储引擎》大约重写了50%的内容。 《MySQL技术内幕:...
MySQL InnoDB 技术内幕 MySQL InnoDB 存储引擎是 MySQL 关系数据库管理系统中最常用的存储引擎之一。InnoDB 存储引擎是 MySQL 的默认存储引擎,它提供了高性能、高可靠性的存储功能。 数据库和实例的区别 -------...
MySQL技术引擎内幕 Innodb存储引擎
《MySQL内核:InnoDB存储引擎 卷1》由资深MySQL专家,机工畅销图书作者亲自执笔,在以往出版的两本InnoDB介绍性图书的基础之上,更深入地介绍InnoDB存储引擎的内核,例如latch、B+树索引、事务、锁等,从源代码的...
《MySQL内核:InnoDB存储引擎 卷1》是一本深度探讨MySQL数据库系统核心部分——InnoDB存储引擎的专业书籍。这本书以超高清的PDF格式呈现,包含详细的书签,便于读者快速定位和查阅相关内容。InnoDB作为MySQL中最常用...
读书笔记:mysql技术内幕innodb存储引擎学习
《MySQL技术内幕:InnoDB存储引擎》是国内目前唯一的一本关于InnoDB的著作,由资深MySQL专家亲自执笔,中外数据库专家联袂推荐,权威性毋庸置疑。内容深入,从源代码的角度深度解析了InnoDB的体系结构、实现原理、...
### MySQL Innodb 引擎特性详解 #### 一、MySQL Innodb 引擎概述 MySQL是一种广泛使用的开源关系型数据库管理系统(RDBMS),它提供了多种存储引擎以满足不同场景的需求。其中,InnoDB是最常用的一种存储引擎之一,...
《MySQL技术内幕_InnoDB存储引擎_姜承尧_第2版》是一本深入探讨MySQL数据库中InnoDB存储引擎的专业书籍。作者姜承尧是数据库领域的知名专家,他的这部著作详细阐述了InnoDB引擎的核心概念、设计原理以及实际操作技巧...
MySQL内核 INNODB存储引擎-卷1-高清-完整目录-2014年5月
本文详细介绍了mysql innodb引擎的原理、配置、调优、故障排除等
读书笔记:MySQL技术内幕(InnoDB存储引擎)个人编辑版
MySQL_InnoDB技术内幕.pdf
本文详细介绍了MySQL InnoDB存储引擎中的索引原理及其实现方式,特别是B+树的应用。通过对比不同的树形结构,我们了解到B+树为何成为数据库索引的理想选择。此外,还讨论了InnoDB与MyISAM的主要差异,以及索引的插入...