mysql distinct跟group by性能
- //准备一张测试表
- mysql> CREATE TABLE `test_test` (
- -> `id` int(11) NOT NULL auto_increment,
- -> `num` int(11) NOT NULL default '0',
- -> PRIMARY KEY (`id`)
- -> ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
- Query OK, 0 rows affected (0.05 sec)
- mysql> delimiter || //改变mysql命令结束符为||
- //建个储存过程向表中插入10W条数据
- mysql> create procedure p_test(pa int(11))
- -> begin
- ->
- -> declare max_num int(11) default 100000;
- -> declare i int default 0;
- -> declare rand_num int;
- ->
- -> select count(id) into max_num from test_test;
- ->
- -> while i < pa do
- -> if max_num < 100000 then
- -> select cast(rand()*100 as unsigned) into rand_num;
- -> insert into test_test(num)values(rand_num);
- -> end if;
- -> set i = i +1;
- -> end while;
- -> end||
- Query OK, 0 rows affected (0.00 sec)
- mysql> call p_test(100000)||
- Query OK, 1 row affected (5.66 sec)
- mysql> delimiter ;//改变mysql命令结束符为;
- mysql> select count(id) from test_test; //数据都进去了
- +-----------+
- | count(id) |
- +-----------+
- | 100000 |
- +-----------+
- 1 row in set (0.00 sec)
- mysql> show variables like "%pro%"; //查看一下,记录执行的profiling是不是开启动了,默认是不开启的
- +---------------------------+-------+
- | Variable_name | Value |
- +---------------------------+-------+
- | profiling | OFF |
- | profiling_history_size | 15 |
- | protocol_version | 10 |
- | slave_compressed_protocol | OFF |
- +---------------------------+-------+
- 4 rows in set (0.00 sec)
- mysql> set profiling=1; //开启
- Query OK, 0 rows affected (0.00 sec)
//准备一张测试表
mysql> CREATE TABLE `test_test` (
-> `id` int(11) NOT NULL auto_increment,
-> `num` int(11) NOT NULL default '0',
-> PRIMARY KEY (`id`)
-> ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
Query OK, 0 rows affected (0.05 sec) mysql> delimiter || //改变mysql命令结束符为|| //建个储存过程向表中插入10W条数据
mysql> create procedure p_test(pa int(11))
-> begin
->
-> declare max_num int(11) default 100000;
-> declare i int default 0;
-> declare rand_num int;
->
-> select count(id) into max_num from test_test;
->
-> while i < pa do
-> if max_num < 100000 then
-> select cast(rand()*100 as unsigned) into rand_num;
-> insert into test_test(num)values(rand_num);
-> end if;
-> set i = i +1;
-> end while;
-> end||
Query OK, 0 rows affected (0.00 sec) mysql> call p_test(100000)||
Query OK, 1 row affected (5.66 sec) mysql> delimiter ;//改变mysql命令结束符为;
mysql> select count(id) from test_test; //数据都进去了
+-----------+
| count(id) |
+-----------+
| 100000 |
+-----------+
1 row in set (0.00 sec) mysql> show variables like "%pro%"; //查看一下,记录执行的profiling是不是开启动了,默认是不开启的
+---------------------------+-------+
| Variable_name | Value |
+---------------------------+-------+
| profiling | OFF |
| profiling_history_size | 15 |
| protocol_version | 10 |
| slave_compressed_protocol | OFF |
+---------------------------+-------+
4 rows in set (0.00 sec) mysql> set profiling=1; //开启
Query OK, 0 rows affected (0.00 sec)
2,测试
- //做了4组测试
- mysql> select distinct(num) from test_test;
- mysql> select num from test_test group by num;
- mysql> show profiles; //查看结果
- +----------+------------+-------------------------------------------+
- | Query_ID | Duration | Query |
- +----------+------------+-------------------------------------------+
- | 1 | 0.07298225 | select distinct(num) from test_test |
- | 2 | 0.07319975 | select num from test_test group by num |
- | 3 | 0.07313525 | select num from test_test group by num |
- | 4 | 0.07317725 | select distinct(num) from test_test |
- | 5 | 0.07275200 | select distinct(num) from test_test |
- | 6 | 0.07298600 | select num from test_test group by num |
- | 7 | 0.07500700 | select num from test_test group by num |
- | 8 | 0.07331325 | select distinct(num) from test_test |
- | 9 | 0.57831575 | create index num_index on test_test (num) | //在这儿的时候,我加了索引
- | 10 | 0.00243550 | select distinct(num) from test_test |
- | 11 | 0.00121975 | select num from test_test group by num |
- | 12 | 0.00116550 | select distinct(num) from test_test |
- | 13 | 0.00107650 | select num from test_test group by num |
- +----------+------------+-------------------------------------------+
- 13 rows in set (0.00 sec)
//做了4组测试
mysql> select distinct(num) from test_test;
mysql> select num from test_test group by num; mysql> show profiles; //查看结果
+----------+------------+-------------------------------------------+
| Query_ID | Duration | Query |
+----------+------------+-------------------------------------------+
| 1 | 0.07298225 | select distinct(num) from test_test |
| 2 | 0.07319975 | select num from test_test group by num |
| 3 | 0.07313525 | select num from test_test group by num |
| 4 | 0.07317725 | select distinct(num) from test_test |
| 5 | 0.07275200 | select distinct(num) from test_test |
| 6 | 0.07298600 | select num from test_test group by num |
| 7 | 0.07500700 | select num from test_test group by num |
| 8 | 0.07331325 | select distinct(num) from test_test |
| 9 | 0.57831575 | create index num_index on test_test (num) | //在这儿的时候,我加了索引
| 10 | 0.00243550 | select distinct(num) from test_test |
| 11 | 0.00121975 | select num from test_test group by num |
| 12 | 0.00116550 | select distinct(num) from test_test |
| 13 | 0.00107650 | select num from test_test group by num |
+----------+------------+-------------------------------------------+
13 rows in set (0.00 sec)
上面的1-8是4组数据,并且是没有加索引的,从中我们可以看出,distinct比group by 会好一点点
10-13是2组数据,是加了索引以后的,从中我们可以看出,group by 比distinct 会好一点点
一般情况,数据量比较大的表,关联字段都会加索引的,,并且加索引后检索时间只有以前的六分之一左右。
mysql distinct跟group by性能的更多相关文章
- MySQL中distinct和group by性能比较[转]
MySQL中distinct和group by性能比较[转] 之前看了网上的一些测试,感觉不是很准确,今天亲自测试了一番.得出了结论(仅在个人计算机上测试,可能不全面,仅供参考) 测试过程: 准备一张 ...
- Mysql distinct、group by
具体业务场景:根据某些字段组合去重得到所有字段结果. 遇到的error:sql_mode=only_full_group_by. 原因是mysql配置问题. distinct: distinct这个关 ...
- mysql下distinct和group by区别对比
在数据表中记录了用户验证时使用的书目,现在想取出所有书目,用DISTINCT和group by都取到了我想要的结果,但我发现返回结果排列不同,distinct会按数据存放顺序一条条显示,而group ...
- 44 答疑(三)--join的写法/Simple nested loop join的性能问题/Distinct和group by的性能/备库自增主键问题
44 答疑(三) Join的写法 35节介绍了join执行顺序,加了straight_join,两个问题: --1 如果用left join,左边的表一定是驱动表吗 --2 如果两个表的join包含多 ...
- distinct和group by的性能比较
distinct和group by的性能比较 当去重复的字段 的个数比较多的时候,group by 比distinct要快很多 当去重复的字符 的个数比较少的时候,distinct 比group by ...
- mysql数据去重复distinct、group by
使用distinct 和group by都可以实现数据去重. select distinct 字段 group by 一般放在where条件后
- Mysql视图的作用及其性能分析
定义:视图是从一个或几个基本表导出的表,它与基本表不同,是一个虚表. 作用: 1.简化操作,不用进行多表查询. 2.当不同种类的用用户共享同一个数据库时,非常灵活,(用户以不同的 方式看待同一数据. ...
- 高性能mysql 第6章 查询性能优化
查询缓存: 在解析一个sql之前,如果查询缓存是打开的,mysql会去检查这个查询(根据sql的hash作为key)是否存在缓存中,如果命中的话,那么这个sql将会在解析,生成执行计划之前返回结果. ...
- MYSQL索引结构原理、性能分析与优化
[转]MYSQL索引结构原理.性能分析与优化 第一部分:基础知识 索引 官方介绍索引是帮助MySQL高效获取数据的数据结构.笔者理解索引相当于一本书的目录,通过目录就知道要的资料在哪里, 不用一页一页 ...
随机推荐
- Java、JSP获得当前日期的年、月、日
Java package com.ob; import java.text.ParseException; import java.text.SimpleDateFormat; import java ...
- 【转】ubuntu自动挂载硬盘方法
首先建立挂载目录例如:sudo mkdir /movie #根目录下建立movie文件夹sudo mkdir /work #根目录下建立work文件夹 然后查看硬盘信息sudo fdisk -l ...
- 【工具类】如何通过代码安装一个apk文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...
- (一)NUnit单元测试心得
由于各种缘由,一本<.Net单元测试艺术>突然出现在了我的办公桌上,于是我的单元测试之路就此开始.通过一两个月不间断的学习,以及不断结合具体的项目做开发,再结合书上的知识对单元测试有了一些 ...
- [NOI导刊2011]影像之结构化特征
问题描述 在影像比对中,有一种方法是利用影像中的边缘(edge)资讯,计算每个边缘资讯中具有代表性的结构化特征,以作为比对两张影像是否相似的判断标准.Water-filling方法是从每个边缘图的一个 ...
- 网页推送库 SignalR
SignalR 可以用这个库开发网页聊天室应用 ASP.NET SignalR 是为 ASP.NET 开发人员提供的一个库,可以简化开发人员将实时 Web 功能添加到应用程序的过程.实时 Web 功能 ...
- BZOJ 1079 [SCOI2008]着色方案
http://www.lydsy.com/JudgeOnline/problem.php?id=1079 思路:如果把每种油漆看成一种状态,O(5^15)不行 DP[a][b][c][d][e][f] ...
- 本地已有SVN项目导入到eclipse中
有时候在本地上checkout了项目,在eclipse中不希望重新checkout一次,可以如下操作: 1.在project上右键-> team -> share project -> ...
- 零基础学习hadoop到上手工作线路指导
零基础学习hadoop,没有想象的那么困难,也没有想象的那么容易.在刚接触云计算,曾经想过培训,但是培训机构的选择就让我很纠结.所以索性就自己学习了.整个过程整理一下,给大家参考,欢迎讨论,共同学习. ...
- 洛谷 P1373 小a和uim之大逃离
2016-05-30 12:31:59 题目链接: P1373 小a和uim之大逃离 题目大意: 一个N*M的带权矩阵,以任意起点开始向右或者向下走,使得奇数步所得权值和与偶数步所得权值和关于K的余数 ...