之前看到的TiDB和MySql的性能对比都是大量短耗时请求下的压测,单机情况下TiDB和MySql的确有些差距,不过笔者最近碰到的场景更多是sql要扫描的行数不小的情况下单sql比较耗时的问题,所以自己做了个简单测试这类型sql的耗时。

TiDB单机环境部署

按照官方文档(https://pingcap.com/docs-cn/dev/how-to/get-started/deploy-tidb-from-docker-compose/)

直接使用docker-composer部署

git clone https://github.com/pingcap/tidb-docker-compose.git  # 下载

cd tidb-docker-compose && docker-compose pull # 拉取镜像
docker-compose up -d # 启动

命令行客户端连接方式

mysql -h 127.0.0.1 -P 4000 -u root

测试

表结构

create table testTable (
`id` int(10) unsigned auto_increment primary key,
`uid` int(10) not null default 0,
`day` int(6) not null default 0,
`field1` varchar(16) not null default '',
`field2` tinyint(3) not null default 0,
`field3` tinyint(3) not null default 0,
`field4` tinyint(3) not null default 0,
`field5` varchar(32) not null default '',
`field6` varchar(32) not null default '',
`field7` varchar(32) not null default '',
key `uid_day_idx` (`uid`,`day`,`field1`, `field3`)
) engine=InnoDB default charset=utf8;

插入数据

  • 5000个随机的uid

  • day 平均分布在20190801~20190830

  • filed1 随机取'a0' ~ 'a9'

  • field3 随机取0~10

插入数据脚本

<?php
$maxRecordNum = 10000000; $tableName = 'testTable';
$host = '127.0.0.1';
$port = '4000';
$dbname = 'test';
$username = 'root';
$password = '';
$dsn = "mysql:host={$host};dbname={$dbname};port={$port}"; function getDay($maxRecordNum, $i) {
$item = (int)($maxRecordNum / 30);
$day = 20190801;
$add = (int)($i/ $item);
return $day + $add;
} function getRandomFieldOne() {
static $fieldsOne = [
"'a0'", "'a1'", "'a2'", "'a3'", "'a4'", "'a5'", "'a6'", "'a7'", "'a8'", "'a9'",
];
return $fieldsOne[rand(0, count($fieldsOne) -1)];
} function getRandomFieldTwo() {
return rand(0, 1);
} function getRandomFieldThree() {
return rand(0, 10);
} function getRandomFieldFour() {
return rand(0, 8);
} function generateRecordsValue($day) {
$minUid = 200000000;
$maxUid = $minUid + 5000; $arrRecord = [
'uid' => rand($minUid, $maxUid),
'day' => $day,
'field1' => getRandomFieldOne(),
'field2' => getRandomFieldTwo(),
'field3' => getRandomFieldThree(),
'field4' => getRandomFieldFour(),
'field5' => "'static'",
'field6' => "'static'",
'field7' => "'static'",
];
return $arrRecord;
} try {
$db = new PDO($dsn, $username, $password); $db->query("truncate {$tableName};");
$db->query("alter table {$tableName} AUTO_INCREMENT=1;");
$arr = [];
for ($i = 1; $i <= $maxRecordNum; $i++) {
$day = getDay($maxRecordNum, $i);
$arr[] = '(' . implode(',', generateRecordsValue($day)) . ')';
if ($i % 10000 === 0) {
$sql = "INSERT INTO {$tableName} (" . implode(',', array_keys(generateRecordsValue(0))) . ") values" . implode(',', $arr) .';';
$res = $db->query($sql);
$arr = [];
sleep(1);
echo "{$i}\n";
}
}
} catch (Exception $e) {
echo $e->getMessage();
}

测试sql脚本

查询15天范围内, 2000个uid, 附带两个字段条件

<?php
$tableName = 'testTable';
$host = '127.0.0.1';
$dbname = 'test';
$username = 'root';
$port = '4000';
$password = '';
//$port = '3306';
//$password = 'guapi123';
$dsn = "mysql:host={$host};dbname={$dbname};port={$port}"; try {
$db = new PDO($dsn, $username, $password);
$arrUid = [];
$minUid = 200000000;
for ($i = 0; $i < 2000; $i++) {
$arrUid[] = $minUid + $i;
}
$total = 0;
for ($i = 0; $i < 15; $i++) {
$startDay = 20190801 + $i;
$endDay = $startDay + 14;
$sql = "select field4 from {$tableName} where uid in (" . implode(',', $arrUid) . ") and day >= {$startDay} and day<={$endDay} and field1 = 'a0' and field3 in (3, 5);";
$startTime = microtime(true);
$res = $db->query($sql);
$endTime = microtime(true);
$cost = (int)(($endTime - $startTime) * 1000);
echo "cost:{$cost}ms\n";
$total += $cost;
}
echo "avg cost:" . (int)($total / 15) . "ms\n"; } catch (Exception $e) {
echo $e->getMessage();
}

测试结果(Mysql和TiDB缓存策略都是默认配置)

TiDB

cost:1744ms
cost:646ms
cost:720ms
cost:614ms
cost:644ms
cost:659ms
cost:662ms
cost:731ms
cost:728ms
cost:669ms
cost:816ms
cost:682ms
cost:778ms
cost:857ms
cost:718ms
avg cost:777ms

Mysql

cost:5256ms
cost:5165ms
cost:5300ms
cost:5461ms
cost:5376ms
cost:5334ms
cost:5435ms
cost:5339ms
cost:5314ms
cost:5278ms
cost:5346ms
cost:5244ms
cost:5387ms
cost:5497ms
cost:5633ms
avg cost:5357ms

一个长耗时SQL在TiDB和Mysql上的耗时测试的更多相关文章

  1. java web(一) 使用sql标签库+tomcat+mysql手动创建一个jsp练习总结

    2016-09-0111:06:53                                     使用sql标签库+tomcat+mysql手动创建一个jsp 1. 1.1安装tomcat ...

  2. 一个高级的J2E工程师需要面对MySQL要有那些基本功夫呢<上>

    1. MySQL的架构介绍1.1 MySQL简介: MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一种关联数据库管理系统,将数据保存在不 ...

  3. SQL Server定时自动抓取耗时SQL并归档数据发邮件脚本分享

    SQL Server定时自动抓取耗时SQL并归档数据发邮件脚本分享 第一步建库和建表 USE [master] GO CREATE DATABASE [MonitorElapsedHighSQL] G ...

  4. SQL Server定时自动抓取耗时SQL并归档数据脚本分享

    原文:SQL Server定时自动抓取耗时SQL并归档数据脚本分享 SQL Server定时自动抓取耗时SQL并归档数据脚本分享 第一步建库 USE [master] GO CREATE DATABA ...

  5. MySQL笔记(5)-- SQL执行流程,MySQL体系结构

    MySQL的体系结构,可以清楚地看到 SQL 语句在 MySQL 的各个功能模块中的执行过程:Server层包括连接层.查询缓存.分析器.优化器.执行器等,涵盖MySQL的大多数核心服务功能,以及所有 ...

  6. 无法复现的“慢”SQL《死磕MySQL系列 八》

    系列文章 四.S 锁与 X 锁的爱恨情仇<死磕MySQL系列 四> 五.如何选择普通索引和唯一索引<死磕MySQL系列 五> 六.五分钟,让你明白MySQL是怎么选择索引< ...

  7. SQL语句优化、mysql不走索引的原因、数据库索引的设计原则

    SQL语句优化 1 企业SQL优化思路 1.把一个大的不使用索引的SQL语句按照功能进行拆分 2.长的SQL语句无法使用索引,能不能变成2条短的SQL语句让它分别使用上索引. 3.对SQL语句功能的拆 ...

  8. sql文件批量导入mysql数据库

    有一百多个sql文件肿么破?一行一行地导入数据库肯定是极其愚蠢的做法,但是我差点就这么做了... 网上首先找到的方法是:写一个xxx.sql文件,里边每一行都是source *.sql ...,之后再 ...

  9. 一个有趣的 SQL 查询(查询7天连续登陆)

    一个有趣的 SQL 查询 一个朋友有这样一个SQL查询需求: 有一个登录表(tmp_test),包含用户ID(uid)和登录时间(login_time).表结构如下: . row ********** ...

随机推荐

  1. pgloader 方便的数据迁移工具

    pgloader 是一个支持多种数据源迁移到pg 数据库的工具,高性能,使用灵活同时作者 也提供了docker 版本的镜像,今年3月份使用此工具的时候,发现好久都没更新了,但是 最近作者有了新版本的发 ...

  2. 用Xpath选择器解析网页(lxml)

    在<爬虫基础以及一个简单的实例>一文中,我们使用了正则表达式来解析爬取的网页.但是正则表达式有些繁琐,使用起来不是那么方便.这次我们试一下用Xpath选择器来解析网页. 首先,什么是XPa ...

  3. 洛谷P3147 262144

    题目 此题数据范围小的话可以用区间\(DP\),但是该题目的数据范围并不能用区间DP来求解,因此我们考虑优化\(DP\). 每个数的生成一定是由这两个区间 考虑区间DP的弊端是并不知道每个数生成的区间 ...

  4. 【转】Resource Localization in YARN

    一个Applciation运行在YARN上的流程为,从YARN Client向ResourceManager提交任务,将Applciation所需资源提交到HDFS中,然后ResourceManage ...

  5. 浅谈 Miller-Robbin 与 Pollard Rho

    前言 $Miller-Robbin$ 与 $Pollard Rho$ 虽然都是随机算法,不过用起来是真的爽. $Miller Rabin$ 算法是一种高效的质数判断方法.虽然是一种不确定的质数判断法, ...

  6. 计算电脑所能表示的最大最小值(c++)

    C++当中获得现在计算机上所能表示的各种类型(比如int,long int,short int,double,float等)最大最小有两种方法,一种是使用c++预先定义的宏,对于有些编译器可能需要包含 ...

  7. debian10使用国内源安装docker以及一些使用方法

    首先, 我的环境是debian, 容器是centos debian 安装添加新存储库所需的依赖项 1 sudo apt install ca-certificates curl software-pr ...

  8. Mysql索引面试题

    转载:https://mp.weixin.qq.com/s/_bk2JVOm2SkXfdcvki6-0w 本文来自一位不愿意透露姓名的粉丝投稿,由Hollis整理并"还原"了面试现 ...

  9. CTF CMS(转)

    CTF--CMS漏洞总结 海洋CMS 6.28 海洋CMS6.28命令执行漏洞 6.45-6.54 漏洞预警 | 海洋CMS(SEACMS)0day漏洞预警 8.8(未验证) 海洋cms前台到后台的g ...

  10. 团队作业-Alpha(3/4)

    队名:软工9组 组长博客:https://www.cnblogs.com/cmlei/ 作业博客:https://edu.cnblogs.com/campus/fzu/SoftwareEngineer ...