MySQL大量进程处于Killed状态。

wubx 回复了问题 • 5 人关注 • 4 个回复 • 1576 次浏览 • 2017-02-10 23:27 • 来自相关话题

tokudb

yangjustins 回复了问题 • 2 人关注 • 3 个回复 • 907 次浏览 • 2017-01-19 14:11 • 来自相关话题

有找到没用的历史数据进行清理吗

回复

wjxiaoit 发起了问题 • 1 人关注 • 0 个回复 • 741 次浏览 • 2017-01-16 09:14 • 来自相关话题

有找到没用的历史数据进行清理吗

回复

wjxiaoit 发起了问题 • 1 人关注 • 0 个回复 • 707 次浏览 • 2017-01-16 09:14 • 来自相关话题

知数堂公开课第30期分享-知数堂第30次公开课: 分享MySQL数据库中MVCC的实现方式

wubx 发表了文章 • 0 个评论 • 640 次浏览 • 2017-01-12 10:21 • 来自相关话题

知数堂第30次公开课: 
      分享MySQL数据库中MVCC的实现方式,以及Undo,Redo Log的工作机制,MySQL中Sharp、Fuzzy两种CheckPoint实现方式。

报名地址:  http://www.itdks.com/dakashuo/playback/273 查看全部
知数堂第30次公开课: 
      分享MySQL数据库中MVCC的实现方式,以及Undo,Redo Log的工作机制,MySQL中Sharp、Fuzzy两种CheckPoint实现方式。

报名地址:  http://www.itdks.com/dakashuo/playback/273

check_gtid_sync.py用于检查从库接收的GTID是否执行完成

keung 发表了文章 • 0 个评论 • 587 次浏览 • 2017-01-10 01:07 • 来自相关话题

check_gtid_sync.py参考用法
python check_gtid_sync.py --host="172.16.60.60“ --port=3306 --user="monitor" --password="monitor4lepus"

脚本内容如下#!/usr/bin/env python
#coding: utf-8

import re
import sys
import argparse
import pymysql.cursors

parser = argparse.ArgumentParser()

class CheckMySQL(object):
def __init__(self, host=None, port=None, user=None, passwd=None):
self.dbhost = host
self.dbport = port
self.dbuser = user
self.dbpassword = passwd

def connect(self):
try:
conn = pymysql.connect(self.dbhost, self.dbuser, self.dbpassword, port=self.dbport, charset='utf8')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
conn.commit()
except Exception, e:
print(e)
return 1
return cursor

def isGTID_sync(self):
try:
with self.connect() as cursor:
cursor.execute("show slave status")
result = cursor.fetchone()
cursor.close()
retd_gtid = int(result.get("Retrieved_Gtid_Set").split("-")[-1])
exec_gtid = int(result.get("Executed_Gtid_Set").split("-")[-1])
if retd_gtid == exec_gtid:
result = "OK"
elif retd_gtid > exec_gtid:
result = "Gtid_Set_Behind_Master: %s" % (retd_gtid - exec_gtid)
except Exception, e:
print(e)
return "ERROR"
return result


if __name__== "__main__":
parser.add_argument("--host", type=str, help="mysql server host")
parser.add_argument("--port", type=int, help="mysql server port")
parser.add_argument("--user", type=str, help="mysql server user")
parser.add_argument("--password", type=str, help="mysql server passwd")
args = parser.parse_args()
if not args.host or not args.port or not args.user or not args.password:
print parser.format_usage()
sys.exit(1)

host=args.host
port=args.port
user=args.user
passwd=args.password
check=CheckMySQL(host,port,user,passwd)
isSync = check.isGTID_sync()
print isSync 查看全部
check_gtid_sync.py参考用法
python check_gtid_sync.py --host="172.16.60.60“ --port=3306 --user="monitor" --password="monitor4lepus"

脚本内容如下
#!/usr/bin/env python
#coding: utf-8

import re
import sys
import argparse
import pymysql.cursors

parser = argparse.ArgumentParser()

class CheckMySQL(object):
def __init__(self, host=None, port=None, user=None, passwd=None):
self.dbhost = host
self.dbport = port
self.dbuser = user
self.dbpassword = passwd

def connect(self):
try:
conn = pymysql.connect(self.dbhost, self.dbuser, self.dbpassword, port=self.dbport, charset='utf8')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
conn.commit()
except Exception, e:
print(e)
return 1
return cursor

def isGTID_sync(self):
try:
with self.connect() as cursor:
cursor.execute("show slave status")
result = cursor.fetchone()
cursor.close()
retd_gtid = int(result.get("Retrieved_Gtid_Set").split("-")[-1])
exec_gtid = int(result.get("Executed_Gtid_Set").split("-")[-1])
if retd_gtid == exec_gtid:
result = "OK"
elif retd_gtid > exec_gtid:
result = "Gtid_Set_Behind_Master: %s" % (retd_gtid - exec_gtid)
except Exception, e:
print(e)
return "ERROR"
return result


if __name__== "__main__":
parser.add_argument("--host", type=str, help="mysql server host")
parser.add_argument("--port", type=int, help="mysql server port")
parser.add_argument("--user", type=str, help="mysql server user")
parser.add_argument("--password", type=str, help="mysql server passwd")
args = parser.parse_args()
if not args.host or not args.port or not args.user or not args.password:
print parser.format_usage()
sys.exit(1)

host=args.host
port=args.port
user=args.user
passwd=args.password
check=CheckMySQL(host,port,user,passwd)
isSync = check.isGTID_sync()
print isSync

tokudb于percona-server5.7.16 源码编译安装

yangjustins 发表了文章 • 0 个评论 • 649 次浏览 • 2017-01-05 16:08 • 来自相关话题

看到有人发tokudb的安装过程,我也写一篇自己源码编译的过程.因为是之前写的简要步骤,所以就没有安装过程的实例展示了.....
ps:至于为什么非要用源码编译,是因为,之前线上用的是源码编译的,然后现在要扩展tokudb,所以就研究了下,有兴趣可以一起探讨.
 
 

tokudb是percona出的一个引擎.跟大多数引擎一样.安装采用插件式安装即可;

1.安装前准备:
1.1需要关闭Transparent huge pages:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

1.2修改selinux:
# vi /etc/selinux/config 
若要临时生效,可以执行:# setenforce 0


2.下载最新的percona server源码包和相同版本的二进制包;

3.安装mysql过程:
3.1安装依赖包:
yum install gcc gcc-c++ ncurses readline-devel ncurses-devel bison bison-devel vim vim-enhanced readline readline-devel libaio libaio-devel make cmake libtermcap libtermcap-devel imake autoconf automake libtool m4 libstdc++-devel zlib-devel readline-devel glibc -y

这是之前传统的源码依赖包,如果需要使用tokudb 还需要安装jemalloc  valgrind valgrind-devel

yum install gcc gcc-c++ ncurses readline-devel ncurses-devel bison bison-devel vim vim-enhanced readline readline-devel libaio libaio-devel make cmake libtermcap libtermcap-devel imake autoconf automake libtool m4 libstdc++-devel zlib-devel readline-devel glibc jemalloc  valgrind valgrind-devel -y


3.2
编译:
 cmake -DCMAKE_INSTALL_PREFIX=/home/mysql3313/ -DMYSQL_DATADIR=/home/mysql3313/data -DSYSCONFDIR=/home/mysql3313 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_FEDERATED_STORAGE_ENGINE=1 -DWITH_PARTITION_STORAGE_ENGINE=1  -DMYSQL_UNIX_ADDR=/home/mysql3313/mysql.sock -DMYSQL_TCP_PORT=3313 -DENABLED_LOCAL_INFILE=1  -DENABLE_DOWNLOADS=1  -DCOMPILATION_COMMENT="Percona Server"  -DOPTIMIZER_TRACE=1   -DWITH_ZLIB=system  -DWITH_VALGRIND=1  -DCMAKE_C_FLAGS=-DHAVE_purify  -DCMAKE_CXX_FLAGS=-DHAVE_purify -DWITH_PARTITION_STORAGE_ENGINE=1    -DZLIB_INCLUDE_DIR=/usr/lib64 -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8  -DDEFAULT_COLLATION=utf8_general_ci  -DMYSQL_USER=mysql  -DWITH_BOOST=/usr/local/boost


make
make install

3.3 初始化:
bin/mysqld --defaults-file=/home/mysql3313/my.cnf  --initialize --user=mysql 

3.4 启动:
support-files/mysql.server start

3.5 修改root密码
alter USER root@'localhost'  IDENTIFIED BY 'new_password'

4.安装tokudb
安装tokudb插件之前,需要copy插件包,(因为在源码包的编译方式中没有编译tokudb的插件包);
从官方网站下载相同版本的二进制包,将解压后的二进制包里面  lib/mysql/目录下(libjemalloc.so  libjemalloc.so.1)两个文件copy到相同目录(/home/mysql3313/lib/mysql/)
                                                         lib/mysql/plugin/ha_tokudb.so 文件copy到相同目录(/home/mysql3313/lib/mysql/plugin/)
然后记得给刚copy的几个文件更改用户
chown mysql:mysql -R /home/mysql3313/lib/mysql*


安装tokudb插件:
INSTALL PLUGIN TokuDB SONAME 'ha_tokudb.so';
INSTALL PLUGIN TokuDB_file_map SONAME 'ha_tokudb.so';
INSTALL PLUGIN TokuDB_fractal_tree_info SONAME 'ha_tokudb.so';
INSTALL PLUGIN TokuDB_fractal_tree_block_map SONAME 'ha_tokudb.so';
INSTALL PLUGIN TokuDB_trx SONAME 'ha_tokudb.so';
INSTALL PLUGIN TokuDB_locks SONAME 'ha_tokudb.so';
INSTALL PLUGIN TokuDB_lock_waits SONAME 'ha_tokudb.so';
INSTALL PLUGIN TokuDB_background_job_status SONAME 'ha_tokudb.so';

检查:
show engines;
show plugins;


tokudb是引擎插件,跟其他插件方式不一样.只需要安装一次就行了.重启后依然有效. 查看全部
看到有人发tokudb的安装过程,我也写一篇自己源码编译的过程.因为是之前写的简要步骤,所以就没有安装过程的实例展示了.....
ps:至于为什么非要用源码编译,是因为,之前线上用的是源码编译的,然后现在要扩展tokudb,所以就研究了下,有兴趣可以一起探讨.
 
 

tokudb是percona出的一个引擎.跟大多数引擎一样.安装采用插件式安装即可;

1.安装前准备:
1.1需要关闭Transparent huge pages:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

1.2修改selinux:
# vi /etc/selinux/config 
若要临时生效,可以执行:# setenforce 0


2.下载最新的percona server源码包和相同版本的二进制包;

3.安装mysql过程:
3.1安装依赖包:
yum install gcc gcc-c++ ncurses readline-devel ncurses-devel bison bison-devel vim vim-enhanced readline readline-devel libaio libaio-devel make cmake libtermcap libtermcap-devel imake autoconf automake libtool m4 libstdc++-devel zlib-devel readline-devel glibc -y

这是之前传统的源码依赖包,如果需要使用tokudb 还需要安装jemalloc  valgrind valgrind-devel

yum install gcc gcc-c++ ncurses readline-devel ncurses-devel bison bison-devel vim vim-enhanced readline readline-devel libaio libaio-devel make cmake libtermcap libtermcap-devel imake autoconf automake libtool m4 libstdc++-devel zlib-devel readline-devel glibc jemalloc  valgrind valgrind-devel -y


3.2
编译:
 cmake -DCMAKE_INSTALL_PREFIX=/home/mysql3313/ -DMYSQL_DATADIR=/home/mysql3313/data -DSYSCONFDIR=/home/mysql3313 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_FEDERATED_STORAGE_ENGINE=1 -DWITH_PARTITION_STORAGE_ENGINE=1  -DMYSQL_UNIX_ADDR=/home/mysql3313/mysql.sock -DMYSQL_TCP_PORT=3313 -DENABLED_LOCAL_INFILE=1  -DENABLE_DOWNLOADS=1  -DCOMPILATION_COMMENT="Percona Server"  -DOPTIMIZER_TRACE=1   -DWITH_ZLIB=system  -DWITH_VALGRIND=1  -DCMAKE_C_FLAGS=-DHAVE_purify  -DCMAKE_CXX_FLAGS=-DHAVE_purify -DWITH_PARTITION_STORAGE_ENGINE=1    -DZLIB_INCLUDE_DIR=/usr/lib64 -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8  -DDEFAULT_COLLATION=utf8_general_ci  -DMYSQL_USER=mysql  -DWITH_BOOST=/usr/local/boost


make
make install

3.3 初始化:
bin/mysqld --defaults-file=/home/mysql3313/my.cnf  --initialize --user=mysql 

3.4 启动:
support-files/mysql.server start

3.5 修改root密码
alter USER root@'localhost'  IDENTIFIED BY 'new_password'

4.安装tokudb
安装tokudb插件之前,需要copy插件包,(因为在源码包的编译方式中没有编译tokudb的插件包);
从官方网站下载相同版本的二进制包,将解压后的二进制包里面  lib/mysql/目录下(libjemalloc.so  libjemalloc.so.1)两个文件copy到相同目录(/home/mysql3313/lib/mysql/)
                                                         lib/mysql/plugin/ha_tokudb.so 文件copy到相同目录(/home/mysql3313/lib/mysql/plugin/)
然后记得给刚copy的几个文件更改用户
chown mysql:mysql -R /home/mysql3313/lib/mysql*


安装tokudb插件:
INSTALL PLUGIN TokuDB SONAME 'ha_tokudb.so';
INSTALL PLUGIN TokuDB_file_map SONAME 'ha_tokudb.so';
INSTALL PLUGIN TokuDB_fractal_tree_info SONAME 'ha_tokudb.so';
INSTALL PLUGIN TokuDB_fractal_tree_block_map SONAME 'ha_tokudb.so';
INSTALL PLUGIN TokuDB_trx SONAME 'ha_tokudb.so';
INSTALL PLUGIN TokuDB_locks SONAME 'ha_tokudb.so';
INSTALL PLUGIN TokuDB_lock_waits SONAME 'ha_tokudb.so';
INSTALL PLUGIN TokuDB_background_job_status SONAME 'ha_tokudb.so';

检查:
show engines;
show plugins;


tokudb是引擎插件,跟其他插件方式不一样.只需要安装一次就行了.重启后依然有效.











tokudb安装过程

smile 发表了文章 • 1 个评论 • 557 次浏览 • 2017-01-05 12:59 • 来自相关话题

安装mysql5.6.25

1.下载安装包:wget http://cdn.mysql.com/archives/ ... ar.gz2. 将mysql解压到/opt/mysql下tar zxvf mysql-5.6.27-linux-glibc2.5-x86_64.tar.gz3. 创建一个软链,便于版本升级cd /usr/local/ ln -s /opt/mysql/mysql-5.6.27-linux-glibc2.5-x86_64 mysql4. 创建MySQL启动用户groupadd mysql useradd -g mysql -s /sbin/nologin -d /usr/local/mysql mysql
chown -R mysql:mysql /usr/local/mysql5. 创建基本的目录mkdir -p /data/mysql/mysql3306/{data,logs,tmp} chown -R mysql:mysql /data/mysql/mysql33066. 创建/etc/my.cnf配置文件(见附件)[root@localhost mysql]# cat /etc/my.cnf
[mysqld]
basedir=/usr/local/mysql
datadir=/data/mysql/mysql3306/data
socket=/tmp/mysql.sock
user=mysql
port = 3306

symbolic-links=0
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[client]
port = 3306
socket = /tmp/mysql.sock7. 做MySQL初始化cd /usr/local/mysql ./scripts/mysql_install_db8. 创建一个启动脚本cp support-files/mysql.server /etc/init.d/mysql9. 启动和关闭/etc/init.d/mysql start|stop|restart


[root@localhost mysql]# /etc/init.d/mysql start

Starting MySQL..                                           [确定]

[root@localhost mysql]# /etc/init.d/mysql stop

Shutting down MySQL..                                      [确定]

10.设置环境变量

[root@localhost mysql]# echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile

[root@localhost mysql]# source /etc/profile

11.进入数据库

mysql

安装jemalloc库

wget http://www.canonware.com/downl ... r.bz2
tar jxvf jemalloc-3.4.1.tar.bz2
cd jemalloc-3.4.1
./configure --prefix=/usr/local/jemalloc-3.4.1
make && make install
ldconfig#配置文件
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
plugin-dir = /usr/local/mysql/lib/mysql/plugin
malloc-lib= /usr/local/jemalloc-3.4.1/lib/libjemalloc.so
plugin-load=ha_tokudb.so
#安装tokudb
1.解压
[root@localhost software]# tar -zxf Percona-Server-5.6.25-rel73.1-TokuDB.Linux.x86_64.ssl101.tar.gz
2.解压后目录如下
[root@localhost Percona-Server-5.6.25-rel73.1-Linux.x86_64.ssl101]# ls
bin  lib  mysql-test  README-TOKUDB
3. 把相关目录放到BASEDIR下
[root@localhost software]# cp -r Percona-Server-5.6.25-rel73.1-Linux.x86_64.ssl101/* /usr/local/mysql
4.启动之前,停用transparent huge pages
[root@localhost software]# echo never > /sys/kernel/mm/redhat_transparent_hugepage/enabled
[root@localhost software]# echo never > /sys/kernel/mm/redhat_transparent_hugepage/defrag
5.启动数据库,并进入数据库
[root@localhost software]# /etc/init.d/mysql start
Starting MySQL..                                           [确定]
[root@localhost software]# mysql
6.手动添加plugin
INSTALL PLUGIN tokudb SONAME 'ha_tokudb.so';
INSTALL PLUGIN tokudb_file_map SONAME 'ha_tokudb.so';
INSTALL PLUGIN tokudb_fractal_tree_info SONAME 'ha_tokudb.so';
INSTALL PLUGIN tokudb_fractal_tree_block_map SONAME 'ha_tokudb.so';
INSTALL PLUGIN tokudb_trx SONAME 'ha_tokudb.so';
INSTALL PLUGIN tokudb_locks SONAME 'ha_tokudb.so';
INSTALL PLUGIN tokudb_lock_waits SONAME 'ha_tokudb.so';
  查看全部
安装mysql5.6.25

1.下载安装包:wget http://cdn.mysql.com/archives/ ... ar.gz2. 将mysql解压到/opt/mysql下tar zxvf mysql-5.6.27-linux-glibc2.5-x86_64.tar.gz3. 创建一个软链,便于版本升级cd /usr/local/ ln -s /opt/mysql/mysql-5.6.27-linux-glibc2.5-x86_64 mysql4. 创建MySQL启动用户groupadd mysql useradd -g mysql -s /sbin/nologin -d /usr/local/mysql mysql
chown -R mysql:mysql /usr/local/mysql5. 创建基本的目录mkdir -p /data/mysql/mysql3306/{data,logs,tmp} chown -R mysql:mysql /data/mysql/mysql33066. 创建/etc/my.cnf配置文件(见附件)[root@localhost mysql]# cat /etc/my.cnf
[mysqld]
basedir=/usr/local/mysql
datadir=/data/mysql/mysql3306/data
socket=/tmp/mysql.sock
user=mysql
port = 3306

symbolic-links=0
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[client]
port = 3306
socket = /tmp/mysql.sock7. 做MySQL初始化cd /usr/local/mysql ./scripts/mysql_install_db8. 创建一个启动脚本cp support-files/mysql.server /etc/init.d/mysql9. 启动和关闭/etc/init.d/mysql start|stop|restart


[root@localhost mysql]# /etc/init.d/mysql start

Starting MySQL..                                           [确定]

[root@localhost mysql]# /etc/init.d/mysql stop

Shutting down MySQL..                                      [确定]

10.设置环境变量

[root@localhost mysql]# echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile

[root@localhost mysql]# source /etc/profile

11.进入数据库

mysql

安装jemalloc库

wget http://www.canonware.com/downl ... r.bz2
tar jxvf jemalloc-3.4.1.tar.bz2
cd jemalloc-3.4.1
./configure --prefix=/usr/local/jemalloc-3.4.1
make && make install
ldconfig#配置文件
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
plugin-dir = /usr/local/mysql/lib/mysql/plugin
malloc-lib= /usr/local/jemalloc-3.4.1/lib/libjemalloc.so
plugin-load=ha_tokudb.so
#安装tokudb
1.解压
[root@localhost software]# tar -zxf Percona-Server-5.6.25-rel73.1-TokuDB.Linux.x86_64.ssl101.tar.gz
2.解压后目录如下
[root@localhost Percona-Server-5.6.25-rel73.1-Linux.x86_64.ssl101]# ls
bin  lib  mysql-test  README-TOKUDB
3. 把相关目录放到BASEDIR下
[root@localhost software]# cp -r Percona-Server-5.6.25-rel73.1-Linux.x86_64.ssl101/* /usr/local/mysql
4.启动之前,停用transparent huge pages
[root@localhost software]# echo never > /sys/kernel/mm/redhat_transparent_hugepage/enabled
[root@localhost software]# echo never > /sys/kernel/mm/redhat_transparent_hugepage/defrag
5.启动数据库,并进入数据库
[root@localhost software]# /etc/init.d/mysql start
Starting MySQL..                                           [确定]
[root@localhost software]# mysql
6.手动添加plugin
INSTALL PLUGIN tokudb SONAME 'ha_tokudb.so';
INSTALL PLUGIN tokudb_file_map SONAME 'ha_tokudb.so';
INSTALL PLUGIN tokudb_fractal_tree_info SONAME 'ha_tokudb.so';
INSTALL PLUGIN tokudb_fractal_tree_block_map SONAME 'ha_tokudb.so';
INSTALL PLUGIN tokudb_trx SONAME 'ha_tokudb.so';
INSTALL PLUGIN tokudb_locks SONAME 'ha_tokudb.so';
INSTALL PLUGIN tokudb_lock_waits SONAME 'ha_tokudb.so';
 

Innodb表select查询顺序不对的思考

wubx 发表了文章 • 2 个评论 • 858 次浏览 • 2016-12-31 09:34 • 来自相关话题

今天知数堂一个学生反馈说在优化课中老师讲Innodb是以主键排序存储,读取的时间以主键为顺序读取,但发现个例外,如下:

CREATE TABLE `zst_t1` (

`uid` int(10) NOT NULL AUTO_INCREMENT,

`id` int(11) NOT NULL,

PRIMARY KEY (`uid`),

KEY `idx_id` (`id`)

) ENGINE=InnoDB;’

写入数据:

INSERT INTO `zst_t1` VALUES (1,1),(12,1),(22,1),(23,1),(33,1),(2,2),(3,2),(10,2),(11,2),(4,4),(13,4),(14,4);

执行查询:

select * from zst_t1;







为什么这个顺序是乱的,不按顺序排列呢?难道Innodb表并不是全按主键存储?

使用innodb_ruby这个工具查看一下存储结构什么样







看样子存储还是按主键排序存储的。没毛病。

再来看一下该表的索引:






看到这里应该明白了怎么会事了吧,原来这个查询是走的索引覆盖,没有在进行回表读取原数据。另外,也在此说明,Innodb二索索引包含了主键存储。

来继续证明一下:







看到using index 吧,表示这个查询利用索引查询出来结果,不用读取原表。

那么我们给造一个通过主键读取数据操作:

select * from zst_t1 use index(primary);






select * from zst_t1 use index(primary); 
 #确认一下。






总结:

这个其实就是一个索引包含的查询案例。 如果静下来思考一下,也许很快就明白了。也不用这样去查问题。

技术在于折腾,多搞搞就明白了:)。 查看全部
今天知数堂一个学生反馈说在优化课中老师讲Innodb是以主键排序存储,读取的时间以主键为顺序读取,但发现个例外,如下:

CREATE TABLE `zst_t1` (

`uid` int(10) NOT NULL AUTO_INCREMENT,

`id` int(11) NOT NULL,

PRIMARY KEY (`uid`),

KEY `idx_id` (`id`)

) ENGINE=InnoDB;’

写入数据:

INSERT INTO `zst_t1` VALUES (1,1),(12,1),(22,1),(23,1),(33,1),(2,2),(3,2),(10,2),(11,2),(4,4),(13,4),(14,4);

执行查询:

select * from zst_t1;

1.png



为什么这个顺序是乱的,不按顺序排列呢?难道Innodb表并不是全按主键存储?

使用innodb_ruby这个工具查看一下存储结构什么样

2.png



看样子存储还是按主键排序存储的。没毛病。

再来看一下该表的索引:

3.png


看到这里应该明白了怎么会事了吧,原来这个查询是走的索引覆盖,没有在进行回表读取原数据。另外,也在此说明,Innodb二索索引包含了主键存储。

来继续证明一下:

4.png



看到using index 吧,表示这个查询利用索引查询出来结果,不用读取原表。

那么我们给造一个通过主键读取数据操作:

select * from zst_t1 use index(primary);

5.png


select * from zst_t1 use index(primary); 
 #确认一下。

6.png


总结:

这个其实就是一个索引包含的查询案例。 如果静下来思考一下,也许很快就明白了。也不用这样去查问题。

技术在于折腾,多搞搞就明白了:)。

MySQL表字段信息统计

HH 发表了文章 • 1 个评论 • 669 次浏览 • 2016-12-29 20:46 • 来自相关话题

今天的目的不是介绍真实的业务场景如何使用 python-mysql-replication,而是推出一枚<MySQL表信息统计>小工具(笔者通过python-mysql-replication实现的)
工具链接:https://github.com/daiguadaidai/mysql_binlog_stat
在之前我也是使用 @吴炳锡 大神的工具, 因为在了的时候感觉显示的有点生涩因此在他的基础上修改了一些重新展示了, 可是在用的时候还是不尽人意。
具体看之前笔者的文章: http://www.ttlsa.com/mysql/mysql-fields-when-time-split/
大神的工具: https://github.com/wubx/mysql-binlog-statistic
笔者重新展示的工具: https://github.com/daiguadaidai/mysql-binlog-statistic
二话不说直接展示如何使用
1、查看帮助
[root@centos7 tmp]# python mysql_binlog_stat.py --help
usage: mysql_binlog_stat.py [-h] [--host HOST] [--port PORT]
[--username USERNAME] [--password PASSWORD]
[--log-file binlog-file-name]
[--log-pos binlog-file-pos]
[--server-id server-id] [--slave-uuid slave-uuid]
[--blocking False/True] [--start-time start-time]
[--sorted-by insert/update/delete]

Description: The script parse MySQL binlog and statistic column.

optional arguments:
-h, --help show this help message and exit
--host HOST Connect MySQL host
--port PORT Connect MySQL port
--username USERNAME Connect MySQL username
--password PASSWORD Connect MySQL password
--log-file binlog-file-name
Specify a binlog name
--log-pos binlog-file-pos
Specify a binlog file pos
--server-id server-id
Specify a slave server server-id
--slave-uuid slave-uuid
Specify a slave server uuid
--blocking False/True
Specify is bloking and parse, default False
--start-time start-time
Specify is start parse timestamp, default None,
example: 2016-11-01 00:00:00
--sorted-by insert/update/delete
Specify show statistic sort by, default: insert主要参数介绍:
--log-file: binlog 文件名称
--log-pos: binlog 文件位置(从哪个位置开始解析)
--blocking: 是否需要使用阻塞的方式进行解析始终为 False 就好(默认就是False)
--start-time: 从什么时间开始解析
--sorted-by: 展示的结果通过什么来排序, 默认是通过 insert 的行数的多少降序排列, 设置的值有 insert/update/delete
2、解析 MySQL binlog
root@(none) 09:17:12>show binary logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000012 | 437066170 |
| mysql-bin.000013 | 536884582 |
| mysql-bin.000014 | 537032563 |
| mysql-bin.000015 | 536950457 |
| mysql-bin.000016 | 87791004 |
| mysql-bin.000017 | 143 |
| mysql-bin.000018 | 143 |
| mysql-bin.000019 | 143 |
| mysql-bin.000020 | 143 |
| mysql-bin.000021 | 1426 |
+------------------+-----------+
10 rows in set (0.01 sec)# 使用命令
[root@centos7 tmp]# time python mysql_binlog_stat.py --log-file=mysql-bin.000012 --log-pos=120 --username=root --password=root --sorted-by='insert'
[
{
"app_db.business_item_sku_detail": {
"row_insert_count": {
"market_price": 273453,
"sku_id": 273453,
"weight": 273453
},
"table_dml_count": {
"insert": 273453,
"update": 0,
"delete": 0
},
"row_update_count": {}
}
},
{
"app_db.business_item_sku_property": {
"row_insert_count": {
"sku_id": 273112,
"created": 273112,
"property_value_id": 273112,
"business_item_id": 273112,
"record_id": 273112,
"property_id": 273112
},
"table_dml_count": {
"insert": 273112,
"update": 0,
"delete": 0
},
"row_update_count": {}
}
},
{
"app_db.business_item_pic": {
"row_insert_count": {
"created": 270993,
"business_item_id": 270993,
"pic_id": 270993,
"pic_no": 270993,
"tmall_shop_id": 270993,
"pic_url": 270993
},
"table_dml_count": {
"insert": 270993,
"update": 0,
"delete": 0
},
"row_update_count": {}
}
},
{
"app_db.business_item": {
"row_insert_count": {
"guide_commission": 264803,
"commission_type": 264803,
"pstatus": 264803,
"num_iid": 264803
},
"table_dml_count": {
"insert": 264803,
"update": 0,
"delete": 0
},
"row_update_count": {}
}
},
{
"test.t_binlog_event": {
"row_insert_count": {
"auto_id": 5926,
"dml_sql": 5926,
"dml_start_time": 5926,
"dml_end_time": 5926,
"start_log_pos": 5926,
"db_name": 5926,
"binlog_name": 5926,
"undo_sql": 5926,
"table_name": 5926,
"end_log_pos": 5926
},
"table_dml_count": {
"insert": 5926,
"update": 0,
"delete": 4017
},
"row_update_count": {}
}
},
{
"test.ord_order": {
"row_insert_count": {
"order_id": 184,
"pay_type": 181,
"amount": 184,
"create_time": 184,
"serial_num": 181
},
"table_dml_count": {
"insert": 184,
"update": 0,
"delete": 0
},
"row_update_count": {}
}
},
{
"test.t1": {
"row_insert_count": {
"id": 7,
"name": 7
},
"table_dml_count": {
"insert": 7,
"update": 2,
"delete": 2
},
"row_update_count": {
"name": 2
}
}
},
{
"test.area": {
"row_insert_count": {},
"table_dml_count": {
"insert": 0,
"update": 0,
"delete": 0
},
"row_update_count": {}
}
}
]

real 5m42.982s
user 5m26.080s
sys 0m8.958s分析了2G多的binlog数据花了大概6分钟时间速度,感觉速度还是不行啊 ^_^。
这边说一下为什么不提供 `--stop-log-file`, `--stop-log-pos`, `--stop-time` 参数
主要是因为 `pymysqlreplication` 的解析如果是没有解析到结尾,它在 master 上创建的链接会一直存在不会消失,需要人工去master kill掉相关的thread. 我问了作者但是并没有得到很好的回应(估计也是我问问题的方式不对吧)
相关问题请看以下链接,(同时希望大家一起来解决一这问题, 来完善以下这个小程序)。
https://github.com/noplay/python-mysql-replication/issues/177#issuecomment-265069799 查看全部
今天的目的不是介绍真实的业务场景如何使用 python-mysql-replication,而是推出一枚<MySQL表信息统计>小工具(笔者通过python-mysql-replication实现的)
工具链接:https://github.com/daiguadaidai/mysql_binlog_stat
在之前我也是使用 @吴炳锡 大神的工具, 因为在了的时候感觉显示的有点生涩因此在他的基础上修改了一些重新展示了, 可是在用的时候还是不尽人意。
具体看之前笔者的文章: http://www.ttlsa.com/mysql/mysql-fields-when-time-split/
大神的工具: https://github.com/wubx/mysql-binlog-statistic
笔者重新展示的工具: https://github.com/daiguadaidai/mysql-binlog-statistic
二话不说直接展示如何使用
1、查看帮助
[root@centos7 tmp]# python mysql_binlog_stat.py --help
usage: mysql_binlog_stat.py [-h] [--host HOST] [--port PORT]
[--username USERNAME] [--password PASSWORD]
[--log-file binlog-file-name]
[--log-pos binlog-file-pos]
[--server-id server-id] [--slave-uuid slave-uuid]
[--blocking False/True] [--start-time start-time]
[--sorted-by insert/update/delete]

Description: The script parse MySQL binlog and statistic column.

optional arguments:
-h, --help show this help message and exit
--host HOST Connect MySQL host
--port PORT Connect MySQL port
--username USERNAME Connect MySQL username
--password PASSWORD Connect MySQL password
--log-file binlog-file-name
Specify a binlog name
--log-pos binlog-file-pos
Specify a binlog file pos
--server-id server-id
Specify a slave server server-id
--slave-uuid slave-uuid
Specify a slave server uuid
--blocking False/True
Specify is bloking and parse, default False
--start-time start-time
Specify is start parse timestamp, default None,
example: 2016-11-01 00:00:00
--sorted-by insert/update/delete
Specify show statistic sort by, default: insert
主要参数介绍:
--log-file: binlog 文件名称
--log-pos: binlog 文件位置(从哪个位置开始解析)
--blocking: 是否需要使用阻塞的方式进行解析始终为 False 就好(默认就是False)
--start-time: 从什么时间开始解析
--sorted-by: 展示的结果通过什么来排序, 默认是通过 insert 的行数的多少降序排列, 设置的值有 insert/update/delete
2、解析 MySQL binlog
root@(none) 09:17:12>show binary logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000012 | 437066170 |
| mysql-bin.000013 | 536884582 |
| mysql-bin.000014 | 537032563 |
| mysql-bin.000015 | 536950457 |
| mysql-bin.000016 | 87791004 |
| mysql-bin.000017 | 143 |
| mysql-bin.000018 | 143 |
| mysql-bin.000019 | 143 |
| mysql-bin.000020 | 143 |
| mysql-bin.000021 | 1426 |
+------------------+-----------+
10 rows in set (0.01 sec)
# 使用命令
[root@centos7 tmp]# time python mysql_binlog_stat.py --log-file=mysql-bin.000012 --log-pos=120 --username=root --password=root --sorted-by='insert'
[
{
"app_db.business_item_sku_detail": {
"row_insert_count": {
"market_price": 273453,
"sku_id": 273453,
"weight": 273453
},
"table_dml_count": {
"insert": 273453,
"update": 0,
"delete": 0
},
"row_update_count": {}
}
},
{
"app_db.business_item_sku_property": {
"row_insert_count": {
"sku_id": 273112,
"created": 273112,
"property_value_id": 273112,
"business_item_id": 273112,
"record_id": 273112,
"property_id": 273112
},
"table_dml_count": {
"insert": 273112,
"update": 0,
"delete": 0
},
"row_update_count": {}
}
},
{
"app_db.business_item_pic": {
"row_insert_count": {
"created": 270993,
"business_item_id": 270993,
"pic_id": 270993,
"pic_no": 270993,
"tmall_shop_id": 270993,
"pic_url": 270993
},
"table_dml_count": {
"insert": 270993,
"update": 0,
"delete": 0
},
"row_update_count": {}
}
},
{
"app_db.business_item": {
"row_insert_count": {
"guide_commission": 264803,
"commission_type": 264803,
"pstatus": 264803,
"num_iid": 264803
},
"table_dml_count": {
"insert": 264803,
"update": 0,
"delete": 0
},
"row_update_count": {}
}
},
{
"test.t_binlog_event": {
"row_insert_count": {
"auto_id": 5926,
"dml_sql": 5926,
"dml_start_time": 5926,
"dml_end_time": 5926,
"start_log_pos": 5926,
"db_name": 5926,
"binlog_name": 5926,
"undo_sql": 5926,
"table_name": 5926,
"end_log_pos": 5926
},
"table_dml_count": {
"insert": 5926,
"update": 0,
"delete": 4017
},
"row_update_count": {}
}
},
{
"test.ord_order": {
"row_insert_count": {
"order_id": 184,
"pay_type": 181,
"amount": 184,
"create_time": 184,
"serial_num": 181
},
"table_dml_count": {
"insert": 184,
"update": 0,
"delete": 0
},
"row_update_count": {}
}
},
{
"test.t1": {
"row_insert_count": {
"id": 7,
"name": 7
},
"table_dml_count": {
"insert": 7,
"update": 2,
"delete": 2
},
"row_update_count": {
"name": 2
}
}
},
{
"test.area": {
"row_insert_count": {},
"table_dml_count": {
"insert": 0,
"update": 0,
"delete": 0
},
"row_update_count": {}
}
}
]

real 5m42.982s
user 5m26.080s
sys 0m8.958s
分析了2G多的binlog数据花了大概6分钟时间速度,感觉速度还是不行啊 ^_^。
这边说一下为什么不提供 `--stop-log-file`, `--stop-log-pos`, `--stop-time` 参数
主要是因为 `pymysqlreplication` 的解析如果是没有解析到结尾,它在 master 上创建的链接会一直存在不会消失,需要人工去master kill掉相关的thread. 我问了作者但是并没有得到很好的回应(估计也是我问问题的方式不对吧)
相关问题请看以下链接,(同时希望大家一起来解决一这问题, 来完善以下这个小程序)。
https://github.com/noplay/python-mysql-replication/issues/177#issuecomment-265069799