0%

InnoDB的自适应哈希索引是由数据库创建的,DBA不能对它进行干预。自适应哈希索引经哈希函数映射到一个哈希表中,因此,对于SELECT .. FROM TABLE WHERE COL=XX的查询速度非常快,但对于范围查找,则无能为力。
通过命令SHOW ENGINE INNODB STATUS,可以查看自适应哈希索引的使用情况。
FILE I/O


I/O thread 0 state: waiting for i/o request (insert buffer thread)
I/O thread 1 state: waiting for i/o request (log thread)
I/O thread 2 state: waiting for i/o request (read thread)
I/O thread 3 state: waiting for i/o request (write thread)
Pending normal aio reads: 0, aio writes: 0,
ibuf aio reads: 0, log i/o’s: 0, sync i/o’s: 0
Pending flushes (fsync) log: 0; buffer pool: 0
119187 OS file reads, 151798763 OS file writes, 928485 OS fsyncs
0.00 reads/s, 0 avg bytes/read, 0.00 writes/s, 0.00 fsyncs/s


INSERT BUFFER AND ADAPTIVE HASH INDEX

阅读全文 »

一、联合索引

联合索引指对表上多个列进行索引,如以下创建表t4:
CREATE TABLE t4(
a INT,
b INT,
PRIMARY KEY(a),
KEY idx_a_b(a,b)
) ENGINE=INNODB;

Idx_a_b就是联合索引,联合索引也是B+树,不同的时,它的键值是多个值,如下图所示:

innodb38

可以看出,键值都是排序的,对于a=1时,b的值有1,2是从小到大排序。通过叶子节点可以读出所有数据。
因此,对于SELECT * FROM t4 WHERE a=xx AND b=xx;是可以使用到(a,b)这个索引的。对于单列查询SELECT * FROM t4 WHERE a=xx 也可利用到这个索引。
因为索引对于第2个键值进行了排序,所以SELECT * FROM t4 WHERE a=xx ORDER BY b;也使用到了索引。
同时,如果索引列为(a,b,c),SELECT * FROM t WHERE a=x AND b=x ORDER BY c,也能用到三个列的索引。

阅读全文 »

一、索引管理

1、创建/删除索引

第一种方式:ALTER TABLE XX ADD xx:
ALTER TABLE tb_name |ADD {INDEX|KEY} [index_name] [index_type] (index_col_name,…) [index_option] …
ALTER TABLE tb_name DROP PRIMARY KEY| DROP {key|index} index_name

第二种方式:CREATE/DROP INDEX
CREATE [UNIQUE] INDEX index_name [index_type] ON tb_name(index_col_name,…)
DROP INDEX index_name ON tb_name;

2、查看索引
查看表的索引信息,用SHOW INDEX FROM tb_name;
如查看t3表的索引:

阅读全文 »

innodb索引的类型有:
• B+树索引
• 全文索引
• 哈希索引

B+树索引并不能找到给定键值的具体行,而是找到行所在的页。然后数据库把页读到内存中再查找。
每页的Page Directory中的槽是按照主键的顺序存放的,对某一条具体记录的查询是通过对Page Directory进行二分查找得到的。

一、B+树

B+树由B树和索引顺序访问方法(ISAM)演化而来。
B+树是为磁盘或其他直接存储辅助设备设计的一种平衡查找树,在B+树中,所有的记录节点都按键值的大小顺序放在同一层的叶子节点上,由各叶子节点指针进行连接。下面的B+树高度为2,每页存放4条记录,扇出(fan out)为5。

innodb28

阅读全文 »

InnoDB页由以下7个部分组成:
• File Header 文件头
• Page Header 页头
• Infinum和Supermum Records
• User Records 用户记录,即行记录
• Free Space 空闲空间
• Page Directory 页目录
• File Trailer 文件结尾信息

innodb18

一、File Header

用来记录页的一些头信息,共38个字节。

innodb20

阅读全文 »

一、InnoDB行的记录格式

1.0.x之前使用Compact和Redundant两种格式来存入行记录;

通过SHOW TABLE STATUS LIKE ‘tablename%’ 来查看表的行记录格式;

1、Compact格式

一个页中存放的行数据越多,性能就越高;

阅读全文 »

一、索引组织表

表是根据主键顺序组织存放的,称为索引组织表,在Innodb引擎中,每个表都必须有主键,如果建表是没有创建主键,则以以下方式来获取主键:
• 如果表中有非空唯一索引,则该列为主键;如果存在多列,则以定义索引的顺序的第一列;
• 如果不符合上述条件,Innodb引擎会自己创建一个6字节大小的指针;

如果主键为单列的情况,通过_rowid可以查看;

二、逻辑存储结构

所有数据被逻辑存储在一个空间里面,称为表空间;表空间由段(segment)、区(extend)、页(page)组成。

阅读全文 »

• 参数文件:mysql实例启动时数据文件的配置,某些参数的初始化;
• 日志文件:记录mysql实例对某些条件做出响应时写入的文件,如错误日志、二进制日志、慢查询日志、查询日志等;
• socket文件:当用UNIX域套接字连接时需要的文件;
• pid文件:mysql实例的进程ID文件;
• MYSQL表结构文件:用来存放mysql表结构的文件;
• 存储引擎文件:每个存储引擎都有自己的文件来记录数据和索引;

一、参数文件:

mysql –help | grep my.cnf
可以通过SHOW VARIABLES查看参数或在information_schma架构下的GLOBAL_VARIABLES来查找
参数类型可分为动态和静态参数两种:
动态参数可以在mysql实例运行中更改,通过set命令
set | [global|session] system_var_name=expr
| [@@global.|@@session.|@@] system_var_name=exp

二、日志文件

1、错误日志:
通过命令SHOW VARIABLES LIKE ‘log_error_%’ 来查找错误日志文件的存放位置
2、慢查询日志:
通过命令SHOW VARIABLES LIKE ‘log_slow_queries’ 来查找慢查询日志文件的存放位置
通过参数:long_query_time来设置慢查询的阀值;
打开log_queries_not_using_index=on来记录没有使用到索引的sql;
5.6.5增加log_throttle_queries_not_using_index表示每分钟允许记录到slowlog的次数;
mysqldump slowlog文件来分析慢查询日志
得到执行时间 最长的10条SQL语句:
mysqldumpslow-s al-n vinin.log
在mysql架构的表slow_log中看慢查询日志:
需要设置参数:set global log_output=’TABLE’
select * from mysql.slow_log
3、查询日志
记录了所有对mysql的请求信息,默认主机名.log
mysql架构下的mysql.general_log
4、二进制日志
binary log 记录了对数据库执行更改的所有操作,不包括select/show;
SHOW MASTER STATUS
SHOW BINLOG EVENTS IN ‘mysqld.000008.log’
作用:
• 恢复(recover)
• 复制(replication)
• 审计
配置bin-log[=name]来启用二进制日志,所以路径为datadir
以下参数影响binlog的行为和记录的信息:
• max_binlog_size 单个日志文件的最大值
• binlog_cache_size 缓冲大小,默认32K,通过查询biglog_cache_use和biglog_cache_disk_use来判断设置是否合理
• sync_binlog 每个缓冲多少次就同步到磁盘
• binlog_do_db/binlog_ignore_db 需要写入或忽略哪些库的日志
• log_slave_upate master->slave->slave架构时使用
• binlog-format 取值STATEMENT/ROW/MIXED
STATEMENT:记录逻辑SQL语句,数据量小
ROW:记录行的更改情况,数据量大
MIXED:默认使用STATEMENT,以下情况使用ROW:
• 表存储引擎为NDB;
• 使用了UUID(),USER(),CURRENT_USER(),FOUND_ROWS(),ROW_COUNT等不确定的函数;
• 使用了insert delay;
• 使用用户自定义函数(UDF):
• 使用了临时表

阅读全文 »

innodb1

组成:

  • 连接池组件
  • 管理服务和工具组件
  • SQL接口组件
  • 查询分析器组件
  • 优化器组件
  • 缓冲(Cache)组件
  • 插件式存储引擎
  • 物理文件

InnoDB存储引擎

行锁设计,支持MVCC、支持外键、提供一致性非锁定读、

阅读全文 »

没错,这个blog就是用hexo+next主题搭建的,从头到脚都散发着hexo的味道。无意中看到hexo这个nodejs的blog框架,很cool,想起几年前用bootstrap+express+mangodb在阿里云搭建的blog,玩了一段时间,后来荒废了,ECS也被回收了。现在又有感觉想玩玩了。这篇文章不是教程,只能算个简单的指引。

一、blog放哪里?

其实如果简单体验一下,放github是个办法,但因为众所周知的原因,github的使用环境有些恶劣,因此我还是准备放在阿里云的ECS上,搞个最便宜的的包年的即可,也不用安装啥,hexo是静态的,因此装个nginx足够了。体验了几年后的ECS,体验好多了,特别远程窗口操作体验特别好。
为了方便本地写好的md类型的blog能部署到nginx对应的web目录下,再装个git,因为hexo支持以git方式上传。

二、申请域名

我看了下,我几年前的vinin.me域名因为一直有续费,所以还能用,虽然.me不能实名认证,但咨询了下客服,已经备案过了,还是可以用的。 省去一堆麻烦,当时备案花了一段时间。如果没域名可以阿里云注册一个再按流程备案。

阅读全文 »