MySQL5.6在线DDL索引创建性能评估与测试分析
作者:告非言普 | 来源:互联网 | 2024-10-23 11:42
基本信息:mysql版本:(product)root@localhost[(none)]>select@@version;+------------+|@@version
基本信息:
mysql版本:
(product)root@localhost [(none)]> select @@version;
+------------+
| @@version |
+------------+
| 5.6.29-log |
+------------+
1 row in set (0.00 sec)
表payment的记录数:
(product)root@localhost [sakila]> select count(*) from payment;
Connection id: 24
Current database: sakila
+----------+
| count(*) |
+----------+
| 16049 |
+----------+
1 row in set (0.00 sec)事务隔离级别:
(product)root@localhost [(none)]> show variables like '%isolation%';
+---------------+----------------+
| Variable_name | Value |
+---------------+----------------+
| tx_isolation | READ-COMMITTED |
+---------------+----------------+
1 row in set (0.00 sec)场景一:
测试在payment_date字段利用ALGORITHM=COPY,LOCK=EXCLUSIVE方式建立索引所需时间,并监控表是否有加锁?
1.会话1先执行每秒监控查询表payment是否有锁,并记录到txt文件#!/bin/bash
while : ;do
date>>/data/mysql/mysql3376/lock.txt &&
mysql -uroot -psafe_2016 -S /tmp/mysql3376.sock -e "show open tables from sakila where In_use>0">>/data/mysql/mysql3376/lock.txt
sleep 1
done
2.会话2执行建索引脚本
(product)root@localhost [(none)]> alter table sakila.payment add index payment_date_ix1 (payment_date),ALGORITHM=COPY,LOCK=EXCLUSIVE;
Query OK, 16049 rows affected (1.08 sec)
Records: 16049 Duplicates: 0 Warnings: 0
3.查看lock.txt
cat lock.txt
Sun Apr 17 20:11:17 HKT 2016
Database Table In_use Name_locked
sakila payment 1 0
4.drop索引,并重启mysql,以清空buffer pool缓存数据
alter table sakila.payment drop index payment_date_ix1;
并重启mysql。小结:监控到表sakila.payment add index在执行建索引过程中有锁表,且建索引时间为1.08秒。场景二:
测试在payment_date字段利用ALGORITHM=COPY,LOCK=SHARED方式建立索引所需时间,并监控表是否有加锁?
1.会话1先执行每秒监控查询表payment是否有锁,并记录到txt文件
#!/bin/bash
while : ;do
date>>/data/mysql/mysql3376/lock.txt &&
mysql -uroot -psafe_2016 -S /tmp/mysql3376.sock -e "show open tables from sakila where In_use>0">>/data/mysql/mysql3376/lock.txt
sleep 1
done
2.会话2执行建索引脚本
(product)root@localhost [(none)]> alter table sakila.payment add index payment_date_ix1 (payment_date),ALGORITHM=COPY,LOCK=SHARED;
Query OK, 16049 rows affected (1.57 sec)
Records: 16049 Duplicates: 0 Warnings: 0
3.查看lock.txt
cat lock.txt
Sun Apr 17 20:19:40 HKT 2016
Database Table In_use Name_locked
sakila payment 1 0
4.drop索引,并重启mysql,以清空buffer pool缓存数据
alter table sakila.payment drop index payment_date_ix1; 小结:监控到表sakila.payment add index在执行建索引过程中有锁表,且建索引时间为1.08秒。
场景三:
测试在payment_date字段利用ALGORITHM=COPY,LOCK=NONE方式建立索引所需时间,并监控表是否有加锁?
1.会话1先执行每秒监控查询表payment是否有锁,并记录到txt文件
#!/bin/bash
while : ;do
date>>/data/mysql/mysql3376/lock.txt &&
mysql -uroot -psafe_2016 -S /tmp/mysql3376.sock -e "show open tables from sakila where In_use>0">>/data/mysql/mysql3376/lock.txt
sleep 1
done
2.会话2执行建索引脚本
(product)root@localhost [(none)]> alter table sakila.payment add index payment_date_ix1 (payment_date),ALGORITHM=COPY,LOCK=NONE;
ERROR 1846 (0A000): LOCK=NONE is not supported. Reason: COPY algorithm requires a lock. Try LOCK=SHARED. 小结:ALGORITHM=COPY,LOCK=NONE两个参数不能同时组合使用,copy方式必需要加锁。场景四:
测试在payment_date字段利用ALGORITHM=INPLACE,LOCK=EXCLUSIVE方式建立索引所需时间,并监控表是否有加锁?
1.会话1先执行每秒监控查询表payment是否有锁,并记录到txt文件
#!/bin/bash
while : ;do
date>>/data/mysql/mysql3376/lock.txt &&
mysql -uroot -psafe_2016 -S /tmp/mysql3376.sock -e "show open tables from sakila where In_use>0">>/data/mysql/mysql3376/lock.txt
sleep 1
done
2.会话2执行建索引脚本
(product)root@localhost [(none)]> alter table sakila.payment add index payment_date_ix1 (payment_date),ALGORITHM=INPLACE,LOCK=EXCLUSIVE;
Query OK, 0 rows affected (0.32 sec)
Records: 0 Duplicates: 0 Warnings: 0
3.查看lock.txt
cat lock.txt
Sun Apr 17 20:29:26 HKT 2016
Sun Apr 17 20:29:27 HKT 2016
Sun Apr 17 20:29:28 HKT 2016
4.drop索引,并重启mysql,以清空buffer pool缓存数据
alter table sakila.payment drop index payment_date_ix1; 小结:监控到表sakila.payment add index在执行建索引过程中无锁表,且建索引时间为0.32秒。场景五:
测试在payment_date字段利用ALGORITHM=INPLACE,LOCK=SHARED方式建立索引所需时间,并监控表是否有加锁?
alter table sakila.payment add index payment_date_ix1 (payment_date),ALGORITHM=INPLACE,LOCK=SHARED;
1.会话1先执行每秒监控查询表payment是否有锁,并记录到txt文件
#!/bin/bash
while : ;do
date>>/data/mysql/mysql3376/lock.txt &&
mysql -uroot -psafe_2016 -S /tmp/mysql3376.sock -e "show open tables from sakila where In_use>0">>/data/mysql/mysql3376/lock.txt
sleep 1
done
2.会话2执行建索引脚本
(product)root@localhost [(none)]> alter table sakila.payment add index payment_date_ix1 (payment_date),ALGORITHM=INPLACE,LOCK=SHARED;
Query OK, 0 rows affected (0.23 sec)
Records: 0 Duplicates: 0 Warnings: 0
3.查看lock.txt
cat lock.txt
Sun Apr 17 20:37:07 HKT 2016
Sun Apr 17 20:37:08 HKT 2016
Sun Apr 17 20:37:09 HKT 2016
4.drop索引,并重启mysql,以清空buffer pool缓存数据
alter table sakila.payment drop index payment_date_ix1; 小结:监控到表sakila.payment add index在执行建索引过程中无锁表,且建索引时间为0.23秒。场景六:
测试在payment_date字段利用ALGORITHM=INPLACE,LOCK=NONE方式建立索引所需时间和是否锁住表上dml操作?
1.会话1先执行每秒监控查询表payment是否有锁,并记录到txt文件
#!/bin/bash
while : ;do
date>>/data/mysql/mysql3376/lock.txt &&
mysql -uroot -psafe_2016 -S /tmp/mysql3376.sock -e "show open tables from sakila where In_use>0">>/data/mysql/mysql3376/lock.txt
sleep 1
done
2.会话2执行建索引脚本
(product)root@localhost [(none)]> alter table sakila.payment add index payment_date_ix1 (payment_date),ALGORITHM=INPLACE,LOCK=NONE;
Query OK, 0 rows affected (0.17 sec)
Records: 0 Duplicates: 0 Warnings: 0
3.查看lock.txt
cat lock.txt
Sun Apr 17 20:39:56 HKT 2016
Sun Apr 17 20:39:57 HKT 2016
Sun Apr 17 20:39:58 HKT 2016
4.drop索引,并重启mysql,以清空buffer pool缓存数据
alter table sakila.payment drop index payment_date_ix1 小结:监控到表sakila.payment add index在执行建索引过程中无锁表,且建索引时间为0.17秒。;场景七:
测试在payment_date字段在默认方式建立索引所需时间和是否锁表?
1.会话1先执行每秒监控查询表payment是否有锁,并记录到txt文件
#!/bin/bash
while : ;do
date>>/data/mysql/mysql3376/lock.txt &&
mysql -uroot -psafe_2016 -S /tmp/mysql3376.sock -e "show open tables from sakila where In_use>0">>/data/mysql/mysql3376/lock.txt
sleep 1
done
2.会话2执行建索引脚本
(product)root@localhost [(none)]> alter table sakila.payment add index payment_date_ix1 (payment_date);
Query OK, 0 rows affected (0.21 sec)
Records: 0 Duplicates: 0 Warnings: 0
3.查看lock.txt
cat lock.txt
Sun Apr 17 20:44:25 HKT 2016
Sun Apr 17 20:44:26 HKT 2016
Sun Apr 17 20:44:27 HKT 2016
4.drop索引,并重启mysql,以清空buffer pool缓存数据
alter table sakila.payment drop index payment_date_ix1; 小结:监控到表sakila.payment add index在执行建索引过程中无锁表,且建索引时间为0.21秒。总结:
1.ALGORITHM=INPLACE和默认方式在线建索引都不会锁表,而copy方式必需锁表
2.ALGORITHM=COPY,LOCK=NONE两个参数不能同时组合使用,因为copy方式必需要加锁。
3.ALGORITHM=INPLACE方式比ALGORITHM=COPY方式建索引时间至少减少70%。
4.重启mysql方式是否有比较干净清空buffer pool中缓存数据,需进一步验证确认。
推荐阅读
-
本文详细介绍如何使用MySQL数据库进行环境搭建,包括创建数据库表并插入示例数据。随后,逐步指导如何配置Maven项目,整合Spring框架与MyBatis,实现高效的数据访问。 ...
[详细]
蜡笔小新 2024-11-21 18:39:23
-
本文详细介绍了在 CentOS 系统中如何创建和管理 SWAP 分区,包括临时创建交换文件、永久性增加交换空间的方法,以及如何手动释放内存缓存。 ...
[详细]
蜡笔小新 2024-11-21 19:01:54
-
-
本文详细介绍了如何在 Ubuntu 16.04 系统上配置 Qt 5.5 的交叉编译环境,特别针对 i.MX6 平台进行了优化设置。内容涵盖从基本的软件安装到高级配置的全过程。 ...
[详细]
蜡笔小新 2024-11-21 17:14:39
-
本文探讨了如何利用OBS Studio进行高效录屏,并通过脚本实现场景的自动生成。适合对自动化办公感兴趣的读者。 ...
[详细]
蜡笔小新 2024-11-21 10:44:53
-
本文详细介绍了如何正确设置Shadowsocks公共代理,包括调整超时设置、检查系统限制、防止滥用及遵守DMCA法规等关键步骤。 ...
[详细]
蜡笔小新 2024-11-20 20:41:33
-
本文详细介绍了在Linux操作系统上安装和部署MySQL数据库的过程,包括必要的环境准备、安装步骤、配置优化及安全设置等内容。 ...
[详细]
蜡笔小新 2024-11-20 18:10:53
-
本文详细介绍了Oracle 11g中的创建表空间的方法,以及如何设置客户端和服务端的基本配置,包括用户管理、环境变量配置等。 ...
[详细]
蜡笔小新 2024-11-21 18:54:39
-
本文详细介绍了如何在Oracle VM VirtualBox中实现主机与虚拟机之间的数据交换,包括安装Guest Additions增强功能,以及如何利用这些功能进行文件传输、屏幕调整等操作。 ...
[详细]
蜡笔小新 2024-11-21 18:13:22
-
对于喜爱使用 Linux 终端进行日常操作的系统管理员来说,Calcurse 提供了一种强大的方式来管理日程安排、待办事项及会议。本文将详细介绍如何在 Linux 上安装和使用 Calcurse,帮助用户更有效地组织工作。 ...
[详细]
蜡笔小新 2024-11-21 17:01:54
-
本文详细介绍了JQuery Mobile框架中特有的事件和方法,帮助开发者更好地理解和应用这些特性,提升移动Web开发的效率。 ...
[详细]
蜡笔小新 2024-11-21 14:24:21
-
本文详细介绍了通过优化SQL查询策略,成功将一张包含955万条记录的财务流水表的查询时间从17秒缩短至300毫秒的方法。文章不仅提供了具体的SQL优化技巧,还深入探讨了背后的数据库原理。 ...
[详细]
蜡笔小新 2024-11-21 12:11:54
-
Web动态服务器Python基本实现 ...
[详细]
蜡笔小新 2024-11-21 08:01:30
-
本文探讨了如何在Android项目中集成JUnit进行单元测试,并详细介绍了修改AndroidManifest.xml文件以支持测试的方法。 ...
[详细]
蜡笔小新 2024-11-20 18:30:14
-
本文介绍了如何在两个Oracle数据库(假设为数据库A和数据库B)之间设置DBLink,以便能够从数据库A中直接访问和操作数据库B中的数据。文章详细描述了创建DBLink前的必要准备步骤以及具体的创建方法。 ...
[详细]
蜡笔小新 2024-11-20 11:20:35
-
本文介绍了实时流协议(RTSP)的基本概念、组成部分及其与RTCP的交互过程,详细解析了客户端请求格式、服务器响应格式、常用方法分类及协议流程,并提供了SDP格式的深入解析。 ...
[详细]
蜡笔小新 2024-11-19 12:19:47
-