我应该如何在mysql中批量查询只附加的表?

我应该如何在mysql中批量查询只附加的表?,mysql,groupwise-maximum,Mysql,Groupwise Maximum,假设我有一个仅附加的表: CREATE TABLE IF NOT EXISTS `states` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `start_date` date DEFAULT NULL, `end_date` date DEFAULT NULL, `person_id` int(10) unsigned default NULL, PRIMARY KEY (`id`

假设我有一个仅附加的表:

CREATE TABLE IF NOT EXISTS `states` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`start_date` date DEFAULT NULL,
`end_date` date DEFAULT NULL,
`person_id` int(10) unsigned default NULL,
PRIMARY KEY (`id`)
))

name
上有一个索引,在
person\u id
上有另一个索引(
person\u id
是对另一个表的fkey引用)

对于每个名字,我们存储一个映射到给定日期范围的
person\u id
。从
name
->
person\u id
的映射是多对一的(这是一个人为的示例,但可以将其视为存储一个人如何更改其姓名)。我们永远不想删除历史记录,因此在更改映射时,我们会插入一个新条目。一个名字的最后一项是真相的来源。最后,我们想在数据集上提出两种不同类型的问题,对此我有一些一般性问题

  • 给定名称/名称列表的当前映射是什么
  • 如果只有一个名称,最简单的查询是:

    select * from states where name = 'name' ORDER BY `id` DESC LIMIT 1;
    
    如果有不止一个名字,我能想出的最好办法是:

    select * from states as a 
        left join states as b on a.name = b.name and a.id < b.id
    where isnull(b.id);
    
    不过,我对小列表的性能有点担心,因为我对mysql的工作原理了解有限。使用explain,我知道mysql在按isnull(b.id)进行过滤之前,通过a上的索引按person_id进行过滤。但它是在连接之前还是连接之后执行此操作?我们会不会浪费很多时间把这两张桌子连在一起?一般来说,我怎么能理解呢?

    第(1)部分的代码是“groupwise max”,但它的效率非常低。(请按照我添加的标签进行更多讨论。)

    我建议您有两张桌子;一个只是附加的,就像你有。让我们将此表称为历史记录。然后创建另一个名为
    Current
    的表。添加新条目时,
    插入
    历史
    ,但将其替换为当前

    如果你采用这种方法,考虑两个表中可能存在的差异。

    主键
    肯定会有所不同;其他索引可能不同,甚至某些列也可能不同。

    我将研究如何使用生成对#1的相同查询和对#2的非常简单的查询(根据文档)。
    select * from states as a 
        left join states as b on a.name = b.name and a.id < b.id
    where isnull(b.id) and person_id in person_id_list