jjzjj

mysql - 按优化分组

coder 2023-10-26 原文

这样的查询:

select * from employe_info 
where id in 
( 
    select max(id) 
    from employe_info
    where date < '2016-02-01' 
    group by employe_id 
) 
and `level` = 1 
limit 10

employe_info 有一百万行。我想查询最近的 employe_info 然后过滤。有什么办法可以优化或设计新的表吗?

下面是简单的建表语句:

CREATE TABLE `employe` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `address` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


CREATE TABLE `employe_info` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `employe_id` int(10) DEFAULT NULL,
  `level` int(2) DEFAULT NULL,
  `date` date DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `fk_employe` (`employe_id`),
  KEY `date_index` (`date`) USING BTREE,
  CONSTRAINT `fk_employe` FOREIGN KEY (`employe_id`) REFERENCES `employe` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

员工的级别随日期而变化。员工具有多层次的值(value)观。所以我想查询员工在某个日期之前的最新级别。

INSERT INTO `employe` (`name`, `address`) VALUES ('joe', 'joe address');

INSERT INTO `employe` (`name`, `address`) VALUES ('mads', 'mads address');

INSERT INTO `employe` (`name`, `address`) VALUES ('max', 'max address');


INSERT INTO `employe_info` (`employe_id`, `level`, `date`) VALUES ('1', '1', '2016-01-01');

INSERT INTO `employe_info` (`employe_id`, `level`, `date`) VALUES ('2', '1', '2016-01-02');

INSERT INTO `employe_info` (`employe_id`, `level`, `date`) VALUES ('3', '1', '2016-01-03');

INSERT INTO `employe_info` (`employe_id`, `level`, `date`) VALUES ('1', '2', '2015-01-01');

INSERT INTO `employe_info` (`employe_id`, `level`, `date`) VALUES ('2', '3', '2015-10-02');

INSERT INTO `employe_info` (`employe_id`, `level`, `date`) VALUES ('3', '4', '2015-08-03');

INSERT INTO `employe_info` (`employe_id`, `level`, `date`) VALUES ('1', '6', '2015-06-01');

INSERT INTO `employe_info` (`employe_id`, `level`, `date`) VALUES ('2', '2', '2015-09-02');

INSERT INTO `employe_info` (`employe_id`, `level`, `date`) VALUES ('3', '4', '2015-06-03');

INSERT INTO `employe_info` (`employe_id`, `level`, `date`) VALUES ('1', '1', '2015-07-01');

INSERT INTO `employe_info` (`employe_id`, `level`, `date`) VALUES ('2', '1', '2015-10-02');

INSERT INTO `employe_info` (`employe_id`, `level`, `date`) VALUES ('3', '1', '2015-11-03');

最佳答案

您似乎需要员工信息,但仅适用于最近拥有 1 级条目的人员。由于您的查询是嵌套的,因此看起来一个人可能有一个日期是 1 级,但时间要求内的较新日期是 2 级。此评估是否准确并且会取消该人被包括在最终输出中的资格?

与其拥有 3 个单独的索引,还不如拥有一个所有部分的复合索引来优化查询。如果您只关心 1 级条目而不管他的日期,那么将其包含在索引中会更有帮助。

也就是说,我对您的查询的第一印象是在 (employe_id, date, id ) 上有一个索引,因为您需要每个员工的最大 ID。如果您只关心 1 级条目,我会将索引放在 (level, employe_id, date, id )

能否请您澄清一下“级别”的上下文?它是否曾经上升/下降或仅上升,或者 1 是顶层而其他所有都是较低层?它是从上升/下降/上升还是一直接近 1?

关于mysql - 按优化分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38369485/

有关mysql - 按优化分组的更多相关文章

  1. ruby-on-rails - 按天对 Mongoid 对象进行分组 - 2

    在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev

  2. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  3. ruby - 在 Ruby 中创建按公共(public)键值分组的新哈希 - 2

    假设我有一个在Ruby中看起来像这样的哈希:{:ie0=>"Hi",:ex0=>"Hey",:eg0=>"Howdy",:ie1=>"Hello",:ex1=>"Greetings",:eg1=>"Goodday"}有什么好的方法可以将它变成如下内容:{"0"=>{"ie"=>"Hi","ex"=>"Hey","eg"=>"Howdy"},"1"=>{"ie"=>"Hello","ex"=>"Greetings","eg"=>"Goodday"}} 最佳答案 您要求一个好的方法来做到这一点,所以答案是:一种您或同事可以在六个月后理解

  4. ruby-on-rails - 无法安装 mysql2 0.3.14 gem - 2

    我看到其他人也遇到过类似的问题,但没有一个解决方案对我有用。0.3.14gem与其他gem文件一起存在。我已经完全按照此处指示完成了所有操作:https://github.com/brianmario/mysql2.我仍然得到以下信息。我不知道为什么安装程序指示它找不到include目录,因为我已经检查过它存在。thread.h文件存在,但不在ruby​​目录中。相反,它在这里:C:\RailsInstaller\DevKit\lib\perl5\5.8\msys\CORE\我正在运行Windows7并尝试在Aptana3中构建我的Rails项目。我的Ruby是1.9.3。$gemin

  5. ruby - 如何使用 ruby​​ mysql2 执行事务 - 2

    我已经开始使用mysql2gem。我试图弄清楚一些基本的事情——其中之一是如何明确地执行事务(对于批处理操作,比如多个INSERT/UPDATE查询)。在旧的ruby-mysql中,这是我的方法:client=Mysql.real_connect(...)inserts=["INSERTINTO...","UPDATE..WHEREid=..",#etc]client.autocommit(false)inserts.eachdo|ins|beginclient.query(ins)rescue#handleerrorsorabortentirelyendendclient.commi

  6. arrays - 如何在下面的示例中将两个值数组分组为 n 个值数组? - 2

    我已经有很多两个值数组,例如下面的例子ary=[[1,2],[2,3],[1,3],[4,5],[5,6],[4,7],[7,8],[4,8]]我想把它们分组到[1,2,3],[4,5],[5,6],[4,7,8]因为意思是1和2有关系,2和3有关系,1和3有关系,所以1,2,3都有关系我如何通过ruby​​库或任何算法来做到这一点? 最佳答案 这是基本Bron–Kerboschalgorithm的Ruby实现:classGraphdefinitialize(edges)@edges=edgesenddeffind_maximum_

  7. ruby - 如何将相同的相邻数字分组 - 2

    如果至少有两个相邻的数字相同,格式为,我需要打包.这是我的输入:[2,2,2,3,4,3,3,2,4,4,5]以及预期的输出:"2:3,3,4,3:2,2,4:2,5"到目前为止我试过:a=[1,1,1,2,2,3,2,3,4,4,5]a.each_cons(2).any?do|s,t|ifs==t如果相等,也许可以尝试计数器,但那是行不通的。 最佳答案 您可以使用Enumerable#chunk_while(如果你使用的是Ruby>=2.3):a.chunk_while{|a,b|a==b}.flat_map{|chunk|chu

  8. ruby - 如何在 Ruby 中将数字分组到不同的桶中 - 2

    我有一个文件,每一行都有数字:010110101311010113114311010431420我想要一个包含每个数字出现次数的散列,在这种情况下:{0101=>2,1010=>2,1311=>2,431=>2,420=>1}我该怎么做? 最佳答案 简单的一行代码,给定一个数组items:items.inject(Hash.new(0)){|hash,item|hash[item]+=1;hash}工作原理:Hash.new(0)创建一个新的Hash,其中访问未定义的键返回0。inject(foo)使用给定的block遍历数组。对于

  9. ruby-on-rails - 当我通过 rvm 使用 rails3 时,如何在 ubuntu 上安装 mysql2 gem? - 2

    我正在尝试绕过rails配置这个极其复杂的迷宫。到目前为止,我设法在ubuntu上设置了rvm(出于某种原因,ruby在ubuntu存储库中已经过时了)。我设法建立了一个Rails项目。我希望我的测试项目使用mysql而不是mysqlite。当我尝试“rakedb:migrate”时,出现错误:“!!!缺少mysql2gem。将其添加到您的Gemfile:gem'mysql2'”当我尝试“geminstallmysql”时,出现错误,告诉我需要为安装命令提供参数。但是,参数列表很大,我不知道该选择哪些。如何通过在ubuntu上运行的rvm和mysql获取rails3?谢谢。

  10. ruby-on-rails - Ruby On Rails Mongoid 分组依据 - 2

    对于按日期分组,我使用了group_by方法。Example:Product.all.group_by{|d|d.created_at}#returnHash但是kaminari不支持Hash。我使用Mongoid,我需要通过页面导航(kaminari)按日期分组。怎么做到的? 最佳答案 Kaminari只支持数组分页例如Kaminari.paginate_array(an_array).page(1).per(10)group_by不是mongoid方法,它是Array的方法,它是对内存中的所有数据进行分组。为了使用mongoid

随机推荐