mysql distinct 慢_MySQL 5.5“select distinct”真的很慢
我的应用程序做了相当多的事情之一是:
select count(distinct id) from x;
id是表x的主键.使用MySQL 5.1(和5.0),它看起来像这样:
mysql> explain SELECT count(distinct id) from x;
+----+-------------+----------+-------+---------------+-----------------+---------+------+---------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------+-------+---------------+-----------------+---------+------+---------+-------------+
| 1 | SIMPLE | x | index | NULL | ix_blahblahblah | 1 | NULL | 1234567 | Using index |
+----+-------------+----------+-------+---------------+-----------------+---------+------+---------+-------------+
在InnoDB上,这并不是很酷,但它也不错.
本周我正在尝试使用MySQL 5.5.11,并且惊讶地发现相同的查询速度慢很多倍.启动缓存后,与之前的5秒相比,大约需要90秒.该计划现在看起来像这样:
mysql> explain select count(distinct id) from x;
+----+-------------+----------+-------+---------------+---------+---------+------+---------+-------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------+-------+---------------+---------+---------+------+---------+-------------------------------------+
| 1 | SIMPLE | x | range | NULL | PRIMARY | 4 | NULL | 1234567 | Using index for group-by (scanning) |
+----+-------------+----------+-------+---------------+---------+---------+------+---------+-------------------------------------+
让它再次快速运行的一种方法是使用来自x的select count(id),这是安全的,因为id是主键,但我正在经历一些抽象层(如NHibernate),这使得这是一个非常重要的任务.
我尝试分析表x,但它没有产生任何明显的差异.
它看起来有点像this bug,虽然不清楚适用的版本是什么,或者发生了什么(没有人在一年内触及它但它是“严重/高/高”).
除了简单地改变我的查询之外,还有什么办法可以让MySQL变得更聪明吗?
更新:
根据要求,这是一种或多或少重现它的方法.我编写了这个SQL脚本来生成100万行虚拟数据(需要10或15分钟才能运行):
delimiter $$
drop table if exists x;
create table x (
id integer unsigned not null auto_increment,
a integer,
b varchar(100),
c decimal(9,2),
primary key (id),
index ix_a (a),
index ix_b (b),
index ix_c (c)
) engine=innodb;
drop procedure if exists fill;
create procedure fill()
begin
declare i int default 0;
while i < 1000000 do
insert into x (a,b,c) values (1,"one",1.0);
set i = i+1;
end while;
end$$
delimiter ;
call fill();
当它完成后,我会观察到这种行为:
> 5.1.48
>从x中选择计数(不同的id)
> EXPLAIN是:key:ix_a,Extra:使用索引
>运行时间不到1.0秒
>从x中选择count(id)
> EXPLAIN是:key:ix_a,Extra:使用索引
>运行时间不到0.5秒
> 5.5.11
>从x中选择计数(不同的id)
> EXPLAIN是:key:PRIMARY,Extra:使用index by group-by
>需要超过7.0秒才能运行
>从x中选择count(id)
> EXPLAIN是:key:ix_a,Extra:使用索引
>运行时间不到0.5秒
编辑:
如果我通过说修改5.5中的查询
select count(distinct id) from x force index (ix_a);
它运行得更快.索引b和c也有效(不同程度),甚至强制索引PRIMARY也有帮助.
mysql distinct 慢_MySQL 5.5“select distinct”真的很慢相关推荐
- 数据库—distinct是什么意思?select distinct怎么用?
首先,明确含义:SELECT DISTINCT 语句用于返回唯一不同的值 然后举一些例子说明一下使用场景: 场景:班级学生表(student)里有三列,分别是学号(stunum).姓名(stuname ...
- SQL基础---SQL SELECT DISTINCT 语句
SQL SELECT DISTINCT 语句 本章讲解 SELECT DISTINCT 语句. SQL SELECT DISTINCT 语句 在表中,可能会包含重复值.这并不成问题,不过,有时您也许希 ...
- mysql锿法_MySQL基本用法
常用sql语句 查看数据库: show databases; 创建一个HA的数据库: create database HA; 查看自己所处的位置: select database(); 删除数据库: ...
- mysql学习记录_Mysql 学习记录
( xampp 的mysql 与 直接用 dnf 安装的 mysql 有冲突! ) 1. 数据库基本知识: 一张表的行 又称为 记录 一张表的列 又称为 字段 表结构:所有字段,规定了你的每一条记录所 ...
- mysql level用法_MYSQL使用方法
1.查询一张表: select * from 表名: 2.查询指定字段:select 字段1,字段2,字段3-.from 表名: 3.where条件查询:select 字段1,字段2,字段3 ...
- mysql 查询 distinct_MYSQL查询数据(二)SELECT | DISTINCT
MySQL SELECT语句简介 SELECT语句允许您从表或视图获取数据.像电子表格一样,表由行和列组成.通常,您需要查看表中的数据.这时候你可以使用mysql数据库中的select语句进行查询数据 ...
- 【MySQL distinct的使用】如果指定了 SELECT DISTINCT,那么 ORDER BY 子句中的项就必须出现在选择列表中
错误语句 SELECT distinct example_column1 FROM test.example_table where delisting_date>now() and produ ...
- mysql中distinct删除_MySQL distinct查询返回具有重复信息的行,需要重复数据删除
我有一个类似于MySQL数据库中下面显示的表格: +----------+----------+----------+----------+----------+ | Column_A | Colum ...
- mysql去重函数的使用方法_MySQL中使用去重distinct方法的示例详解
一 distinct 含义:distinct用来查询不重复记录的条数,即distinct来返回不重复字段的条数(count(distinct id)),其原因是distinct只能返回他的目标字段,而 ...
最新文章
- unity天空盒渐变_CodeGo.netgt;如何使Unity中的径向渐变天空盒?
- 图灵奖颁给超算跑分开创者!MatlabSciPy都跟他有关:“我眼中一切都是线性代数”...
- java面试题之简单介绍一下集合框架
- C++ Primer 5th笔记(chap 17 标准库特殊设施)regex_replace
- 趁着对象泡脚的功夫,我把vueX吃透了
- This relative module was not found ./cptable webpack
- linux 优先级必须为整数,进程友好性(优先级)设置对Linux没有影响
- 成交量与股价关系的深度剖析 (一)
- 连续数字及数字串识别技术
- python math数学模块
- 考勤打卡记录数据库表结构_中控zktime5.0考勤管理系统数据库表结构
- Vue的axios封装
- html微信表情,emoji表情,QQ表情,微信表情转换
- vue项目中如何简单的读取声音文件
- alios下载_AliOS Studio(阿里编程工具)
- Java语言为excel添加水印,使用原生POI, (XSSFWorkbook, XSSFSheet), 真正背景图水印效果,非普通图片张贴
- cocos2dx 编译android-studio nkd报错的解决方法
- Android 获取视频宽高
- Excel中金额小写转大写,职场小技能,值得学习
- Maya2017下载安装与激活
热门文章
- 记一次MySQL AUTO_INCREMENT的故障
- 日本政府用AI分配对象了!给你分一个的话,敢不敢要?
- 每日一皮:测试的时候一切ok,真正上线的时候……
- 每日一皮:当产品经理试图让程序员冷静下来的时候...
- 7月平均工资下来,Java程序员哭笑不得!
- mysql 编码 windows_修改mysql默认编码的方法(windows环境)
- php validator,实用的PHP验证器类Validator
- 数据库在EF中创建模型
- LNK1181 无法打开输入文件“myelin64_1.lib“
- c++ opencv roi