mysql技术innodb分区_mysql技术内幕innodb存储引擎(笔记)

mysql技术内幕innodb存储引擎(笔记)

### 1. mysql 体系结构和存储引擎

mysql 是按 /etc/my.cnf->/etc/mysql/my.cnf->/usr/local/mysql/etc/my.cnf->~/.my.cnf

mysql 组成:

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

同一个表,使用不用的存储引擎,所占的空间大小有所不同.

常用的进程通信方式有管道、命名管道、命名字、TCP/IP套接字、Unix域名套接字

TCP/IP套接字方式是mysql在任何平台下都提供的连接方式,也是网络中使用得最多的一种方式.

命名管道和共享内存

在mysql,使用命名管道需在配置文件中启用--enable-named-pipe选项.

共享内存的,需在配置文件中添加--shared-memory; 在连接时,mysql客户端还必须使用-protocol=memory选项.

### 2. innodb存储引擎

*后台线程

默认情况下,innodb存储引擎的后台线程有7个--4个IO thread,1个master thread, 1个锁监控线程,1个错误监控线程

--------

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)

*内存

innodb 存储引擎内存由一下几个部分组成:缓冲池 buffer pool / 重做日志缓冲池 redo log buffer 以及 额外的内存池 additional memory pool

mysql> show variables like 'innodb%size';

+---------------------------------+-----------+

| Variable_name                   | Value     |

+---------------------------------+-----------+

| innodb_additional_mem_pool_size | 67108864  |

| innodb_buffer_pool_size         | 281018368 |

| innodb_log_buffer_size          | 8388608   |

+---------------------------------+-----------+

Buffer pool size   17152

Free buffers       17088

Database pages     64

Modified db pages  0

buffer pool size 表明了一共有多少个缓冲帧(buffer frame) 每个buffer frame 为16K

free buffers 表示当前空闲的缓冲帧,database pages 表示已经使用的缓冲帧,modified db pages 表示脏页的数量

* master thread

master thread的线程优先级别最高.其内部由几个循环loop组成: 主循环 (loop)、后台循环(background loop)、刷新循环(flush loop)、暂停循环(suspend loop)。

关键特性:插入缓冲、两次写、自适应哈希索引

*插入缓冲

两个条件:索引是辅助索引、索引不是唯一的

### 3. 文件

参数文件

如果mysql在默认的数据库目录下找不到mysql架构,则启动失败,在日志中如下内容:

[error] fatal error: can't open and lock pribilege tables : table 'mysql.host' doesn't exist

日志文件

错误日志、二进制日志、慢查询日志、查询日志

用table记录慢查询日志:(查询日志也一样)general_log

mysql> show create table mysql.slow_log;

mysql> show variables like 'log_output';

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| log_output    | FILE  |

+---------------+-------+

mysql> set global log_output='TABLE';

mysql> select count(*) from mysql.slow_log;

+----------+

| count(*) |

+----------+

|        3 |

+----------+

二进制文件的作用:恢复、复制

套接字文件

pid文件

表结构定义文件

innodb存储引擎文件

### 4. 表

* innodb 存储引擎表的类型

在innodb存储引擎中,每张表都有个主键

首先表中是否有非空的唯一索引(unique not null),如果有,则该列为主键

不符合上述条件,innodb存储引擎自动创建一个6个字节大小的之争。

* innodb 行记录格式

compact 和 redundant 两种格式

redundant 是为兼容之前的版本而保留的

show table status like ***

如:create table testtable ( *** ) engine=innodb charset=latin1 row_format=compact;

* 约束

建表时定义也可以使用alter table命令创建

如:

mysql> create table u ( id int, name varchar(20), id_card char(18), primary key(id), unique key(name));

mysql> select constraint_name,constraint_type from information_schema.table_constraints where table_name='u'\G;

*************************** 1. row ***************************

constraint_name: PRIMARY

constraint_type: PRIMARY KEY

*************************** 2. row ***************************

constraint_name: name

constraint_type: UNIQUE

2 rows in set (0.00 sec)

alter table u add unique key uk_id_card(id_card);

外键约束:

create table p ( id int, u_id int, primary key (id), foreign key (u_id) references p (id));

select * from information_schema.referential_constraints where constraint_schema='wjlcn';

mysql 设置sql_mode 用来严格审核输入的参数

如:set sql_mode='STRICT_TRANS_TABLES';

* 分区表

mysql> show variables like '%partition%';

+-------------------+-------+

| Variable_name     | Value |

+-------------------+-------+

| have_partitioning | YES   |

+-------------------+-------+

1 row in set (0.00 sec)

mysql> show plugins;

+------------+----------+----------------+---------+---------+

| Name       | Status   | Type           | Library | License |

+------------+----------+----------------+---------+---------+

| binlog     | ACTIVE   | STORAGE ENGINE | NULL    | GPL     |

| partition  | ACTIVE   | STORAGE ENGINE | NULL    | GPL     |

| ARCHIVE    | ACTIVE   | STORAGE ENGINE | NULL    | GPL     |

| BLACKHOLE  | ACTIVE   | STORAGE ENGINE | NULL    | GPL     |

| CSV        | ACTIVE   | STORAGE ENGINE | NULL    | GPL     |

| FEDERATED  | DISABLED | STORAGE ENGINE | NULL    | GPL     |

| MEMORY     | ACTIVE   | STORAGE ENGINE | NULL    | GPL     |

| InnoDB     | ACTIVE   | STORAGE ENGINE | NULL    | GPL     |

| MyISAM     | ACTIVE   | STORAGE ENGINE | NULL    | GPL     |

| MRG_MYISAM | ACTIVE   | STORAGE ENGINE | NULL    | GPL     |

+------------+----------+----------------+---------+---------+

mysql 数据库支持 range、list、hash、key、columns分区,并且可以使用hash或者key来进行子分区。需注意的是,分区不是总适合于OLTP应用,你应该根据自己的应

用好好规划自己的分区设计?

### 5. 索引与算法

innodb 存储引擎支持两种常见的索引,一种是B+树索引,另一种是哈希索引。

### 6. 锁

锁的类型:

共享锁 S Lock 允许事务读一行数据。

排他锁 X Lock 允许事务删除或者更新一行数据。

意向锁是表级别的锁

意向共享锁 IS Lock 事务想要获得一个表中某几行的共享锁

意向排他锁 IX Lock 事务想要获得一个表中某几行的排他锁

### 7. 事务

原子性、一致性、隔离性、持久性

事务控制语句:

start transaction|begin 显式地开启一个事务

commit

rollback

savepoint identifier 允许你在事务中创建一个保存点,一个事务中可以有多个savepoint

rollback to [savepoint] identifier

set transaction 这个语句用来设置事务的隔离级别。innodb存储引擎提供的事务隔离级别有:

read uncommitted、read committed、repeatable read、serializable

completion_type 参数设置

### 8. 备份与恢复

mysql数据库提供的大多数工具(如mysqldump、ibbackup、replication)都能很好地完成备份的工作

通过第三方的一些工具来完成,如xtrabackup、LVM快照备份等

### 9. 性能调优

*选择适合的cpu

最好支持64位

cpu是多核,可以通过修改参数innodb_read_io_threads 和 innodb_write_io_threads来增大IO的线程,这样也能更充分利用cpu的多核性能。

*内存的重要性

如何判断当前数据库的内存是否已经达到瓶颈?可以通过查看当前服务器的状态,比较物理磁盘的读取和内存读取的比例来判断缓冲池中的命中率,通常innodb存储引

擎的缓冲池的命中率不应该小于99%

innodb_buffer_pool_reads 表示从物理磁盘读取页的次数;

innodb_buffer_pool_read_ahead 预读的次数;

innodb_buffer_pool_read_ahead_evicted 预读的页,但是没有被读取就从缓冲池中被替换的页的数量,一般用来判断预读的效率;

innodb_buffer_pool_read_requests 从缓冲池中读取页的次数;

innodb_data_read 总共读入的字节数;

innodb_data_reads  发起读取请求的次数,每次读取可能需要读取多个页。

如:mysql> show global status like 'innodb%read%';

+-----------------------------------+---------+

| Variable_name                     | Value   |

+-----------------------------------+---------+

| Innodb_buffer_pool_read_ahead_rnd | 1       |

| Innodb_buffer_pool_read_ahead_seq | 0       |

| Innodb_buffer_pool_read_requests  | 4149    |

| Innodb_buffer_pool_reads          | 33      |

| Innodb_data_pending_reads         | 0       |

| Innodb_data_read                  | 3559424 |

| Innodb_data_reads                 | 47      |

| Innodb_pages_read                 | 84      |

| Innodb_rows_read                  | 129     |

+-----------------------------------+---------+

缓冲池命中率=innodb_buffer_pool_read_requests/(innodb_buffer_pool_read_requests+innodb_buffer_pool_read_ahead+innodb_buffer_pool_reads)

平均每次读取的字节数=innodb_data_read/innodb_data_reads

*硬盘对数据库性能的影响

对于数据库应用来说,RAID10是最好的选择?

*合理地设置RAID

*操作系统的选择也很重要

*不同文件系统对数据库的影响

*选择合适的基准测试工具

sysbench 和 mysql-tpcc

### 10 innodb 存储引擎源代码的编译和调试

阅读(4151) | 评论(0) | 转发(0) |

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值