可以在MySQL表的顶部插入新行吗?

可以在MySQL表的顶部插入新行吗?,mysql,Mysql,MySQL表中的所有行都是这样插入的: 1 2 3 有没有办法在表格顶部插入新行,使表格看起来像这样 3 2 1 是的,是的,我知道“订购方式”,但让我解释一下问题。我有一个交友网站,用户可以按性别、年龄、城市等搜索个人资料。有20多个搜索条件,不可能为每个可能的组合创建索引。因此,如果使用“orderby”,搜索通常以“usingtemporary,usingfilesort”结束,这会导致服务器负载非常高。如果我删除“order by”,最旧的配置文件将显示为第一个,用户必须转到最后一页才能

MySQL表中的所有行都是这样插入的:

1
2
3

有没有办法在表格顶部插入新行,使表格看起来像这样

3
2
1


是的,是的,我知道“订购方式”,但让我解释一下问题。我有一个交友网站,用户可以按性别、年龄、城市等搜索个人资料。有20多个搜索条件,不可能为每个可能的组合创建索引。因此,如果使用“orderby”,搜索通常以“usingtemporary,usingfilesort”结束,这会导致服务器负载非常高。如果我删除“order by”,最旧的配置文件将显示为第一个,用户必须转到最后一页才能看到新的配置文件。这是非常糟糕的,因为搜索结果的第一页看起来总是一样的,用户感觉没有新的配置文件。这就是我问这个问题的原因。如果无法在表格顶部插入最后一行,您可以提出其他建议吗?

如果您“手动”添加id并给它一个负值,那么我(可能没有人)会建议您这样做:

  • 常规插入,例如

    插入t值(…)

  • 使用set更新,例如

    更新t set id=-id,其中id=last_insert_id()


  • 没有ORDERBY子句时返回结果的顺序取决于RDBM。在MySQL中,或者至少在大多数引擎中,如果您没有明确指定从最早的条目到新条目的升序顺序。行的“物理”位置并不重要。我不确定是否所有mysql引擎都是这样工作的。即,在PostgreSQL中,“默认”顺序首先显示最近更新的行。这可能也是一些MySQL引擎的工作方式

    无论如何,关键是——如果你想让结果有序——总是指定排序顺序,而不是仅仅依赖于一些似乎有效的默认值。在您的情况下,您需要一些琐碎的东西-您希望用户按降序排列,因此只需使用:

    SELECT * FROM users ORDER BY id DESC
    

    我认为您只需要确保,如果总是需要首先显示最新数据,那么所有索引都需要首先指定日期/时间字段,并且所有查询都需要首先按该字段排序


    如果ORDER BY减慢了速度,那么我会说,您需要优化查询或数据库结构。

    通常您指定一个自动递增的主键

    但是,您可以这样指定主键:

    CREATE TABLE table1 (
      id signed integer primary key default 1, <<-- no auto_increment, but has a default value
      other fields .....
    
    现在,您的id将从-1开始,并从那里向下运行。

    插入触发器将确保不会出现并发问题

    我知道,自从提出上述问题以来,已经过去了很多时间。但我要补充一些意见:

    我使用的是MySQL版本:5.7.18-0ubuntu0.16.04.1


    当noORDER BY子句与SELECT一起使用时,无论记录的添加顺序如何,都会显示记录,在表的主键序列中。

    如果没有数十亿个配置文件,最好在用户注册日期使用
    orderby
    索引:它更快,解决了所有问题。在顶部插入最后一个配置文件(如果可以的话)会使另一个查询变慢。。。因此,解决一个问题,然后再创建另一个问题……按
    订购是一个好办法。试着读一下这篇文章,也许它会给你一些帮助。这真的不会加快查询速度。你在说什么查询?当然,
    INSERT
    将在两次点击中完成(速度较慢),但是关于
    SELECT
    他去掉了
    ORDER BY
    子句(更快)-这是他想要的(不是他需要的)。这没有错,但他已经声明他知道ORDER BY,并且他说这太慢了,他不喜欢。您的答案应该包括对缓慢性的修复(索引、组合键、解释选择等),保持“默认”顺序必然意味着某种耗时和内存消耗的维护,除非您永远无法恢复可用空间。它还将违反SQL标准。我怀疑这样的产品是否存在。好吧,如果没有……的订单,结果不能按他想要的方式订购。。。描述分类。我在这个问题上看不到任何其他有用的信息,所以我可以提出索引之类的建议。我在最简单的示例中使用了一个id,因为它应该是一个索引的int列,如果您使用这个。。排序不会比这快很多。如果OP提供了更多的细节,我很乐意对这个问题进行更多的思考:)ORDER BY不需要依赖于“20个搜索条件”。它只需要依赖于1个索引,在您的例子中,它是基于ID的。如果您有单独的ID索引,MySQL应该使用它。如果MySQL不能对ORDER BY使用单独的索引,那么按反向ID排序的唯一可靠方法就是切换到更好的DB或升级硬件,并且仍然使用ORDER BY。
    DELIMITER $$
    
    CREATE TRIGGER ai_table1_each BEFORE INSERT ON table1 FOR EACH ROW
    BEGIN
      DECLARE new_id INTEGER;
      SELECT COALESCE(MIN(id), 0) -1 INTO new_id FROM table1;
      SET NEW.id = new_id;
    END $$
    
    DELIMITER ;