我的应用程序做了相当多的事情之一是:

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”真的很慢相关推荐

  1. 数据库—distinct是什么意思?select distinct怎么用?

    首先,明确含义:SELECT DISTINCT 语句用于返回唯一不同的值 然后举一些例子说明一下使用场景: 场景:班级学生表(student)里有三列,分别是学号(stunum).姓名(stuname ...

  2. SQL基础---SQL SELECT DISTINCT 语句

    SQL SELECT DISTINCT 语句 本章讲解 SELECT DISTINCT 语句. SQL SELECT DISTINCT 语句 在表中,可能会包含重复值.这并不成问题,不过,有时您也许希 ...

  3. mysql锿法_MySQL基本用法

    常用sql语句 查看数据库: show databases; 创建一个HA的数据库: create database HA; 查看自己所处的位置: select database(); 删除数据库: ...

  4. mysql学习记录_Mysql 学习记录

    ( xampp 的mysql 与 直接用 dnf 安装的 mysql 有冲突! ) 1. 数据库基本知识: 一张表的行 又称为 记录 一张表的列 又称为 字段 表结构:所有字段,规定了你的每一条记录所 ...

  5. mysql level用法_MYSQL使用方法

    1.查询一张表:     select * from 表名: 2.查询指定字段:select 字段1,字段2,字段3-.from 表名: 3.where条件查询:select 字段1,字段2,字段3 ...

  6. mysql 查询 distinct_MYSQL查询数据(二)SELECT | DISTINCT

    MySQL SELECT语句简介 SELECT语句允许您从表或视图获取数据.像电子表格一样,表由行和列组成.通常,您需要查看表中的数据.这时候你可以使用mysql数据库中的select语句进行查询数据 ...

  7. 【MySQL distinct的使用】如果指定了 SELECT DISTINCT,那么 ORDER BY 子句中的项就必须出现在选择列表中

    错误语句 SELECT distinct example_column1 FROM test.example_table where delisting_date>now() and produ ...

  8. mysql中distinct删除_MySQL distinct查询返回具有重复信息的行,需要重复数据删除

    我有一个类似于MySQL数据库中下面显示的表格: +----------+----------+----------+----------+----------+ | Column_A | Colum ...

  9. mysql去重函数的使用方法_MySQL中使用去重distinct方法的示例详解

    一 distinct 含义:distinct用来查询不重复记录的条数,即distinct来返回不重复字段的条数(count(distinct id)),其原因是distinct只能返回他的目标字段,而 ...

最新文章

  1. unity天空盒渐变_CodeGo.netgt;如何使Unity中的径向渐变天空盒?
  2. 图灵奖颁给超算跑分开创者!MatlabSciPy都跟他有关:“我眼中一切都是线性代数”...
  3. java面试题之简单介绍一下集合框架
  4. C++ Primer 5th笔记(chap 17 标准库特殊设施)regex_replace
  5. 趁着对象泡脚的功夫,我把vueX吃透了
  6. This relative module was not found ./cptable webpack
  7. linux 优先级必须为整数,进程友好性(优先级)设置对Linux没有影响
  8. 成交量与股价关系的深度剖析 (一)
  9. 连续数字及数字串识别技术
  10. python math数学模块
  11. 考勤打卡记录数据库表结构_中控zktime5.0考勤管理系统数据库表结构
  12. Vue的axios封装
  13. html微信表情,emoji表情,QQ表情,微信表情转换
  14. vue项目中如何简单的读取声音文件
  15. alios下载_AliOS Studio(阿里编程工具)
  16. Java语言为excel添加水印,使用原生POI, (XSSFWorkbook, XSSFSheet), 真正背景图水印效果,非普通图片张贴
  17. cocos2dx 编译android-studio nkd报错的解决方法
  18. Android 获取视频宽高
  19. Excel中金额小写转大写,职场小技能,值得学习
  20. Maya2017下载安装与激活

热门文章

  1. 记一次MySQL AUTO_INCREMENT的故障
  2. 日本政府用AI分配对象了!给你分一个的话,敢不敢要?
  3. 每日一皮:测试的时候一切ok,真正上线的时候……
  4. 每日一皮:当产品经理试图让程序员冷静下来的时候...
  5. 7月平均工资下来,Java程序员哭笑不得!
  6. mysql 编码 windows_修改mysql默认编码的方法(windows环境)
  7. php validator,实用的PHP验证器类Validator
  8. 数据库在EF中创建模型
  9. LNK1181 无法打开输入文件“myelin64_1.lib“
  10. c++ opencv roi