tokudb

MySQLyangjustins 回复了问题 • 2 人关注 • 3 个回复 • 51 次浏览 • 4 天前 • 来自相关话题

MySQL大量进程处于Killed状态。

MySQLyouge 回复了问题 • 3 人关注 • 2 个回复 • 61 次浏览 • 5 天前 • 来自相关话题

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

回复

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

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

回复

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

有关数据类型与其占用空间计算方式

MySQLcfanbo 回复了问题 • 2 人关注 • 2 个回复 • 63 次浏览 • 2017-01-12 23:58 • 来自相关话题

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

MySQLwubx 发表了文章 • 0 个评论 • 20 次浏览 • 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是否执行完成

MySQLkeung 发表了文章 • 0 个评论 • 32 次浏览 • 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 源码编译安装

MySQLyangjustins 发表了文章 • 0 个评论 • 32 次浏览 • 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安装过程

MySQLsmile 发表了文章 • 1 个评论 • 30 次浏览 • 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查询顺序不对的思考

MySQLwubx 发表了文章 • 1 个评论 • 306 次浏览 • 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


总结:

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

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