首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查询优化

查询优化
EN

Stack Overflow用户
提问于 2009-08-27 12:25:20
回答 3查看 386关注 0票数 2

我有两个问题。

首先:

代码语言:javascript
复制
SELECT * FROM `table` WHERE col='xyz' LIMIT 100
//Time Taken: 0.0047s

第二:

代码语言:javascript
复制
SELECT * FROM `table` WHERE col='xyz' ORDER BY Id DESC LIMIT 100
//Time Taken: 1.8208s

第二种方法需要更长的时间。我知道这是为什么,因为首先我必须选择整个表,然后进行排序,而第一个查询只返回前100行。

有没有办法使用其他方法进行排序,比如选择最后100行,然后进行排序?或者是我做错了查询,可以更快地进行查询?

注意Id是自动递增的,因此选择最后一行仍然会在排序时返回正确的数据。

代码语言:javascript
复制
CREATE TABLE `table`(
    `Id` BIGINT NOT NULL AUTO_INCREMENT,
    `dateReg` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,

    PRIMARY KEY (`Id`)
) ENGINE=MyISAM
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-08-27 14:40:41

对于连续的ids:

代码语言:javascript
复制
SELECT t.*
  FROM TABLE t
  JOIN (SELECT MAX(t.id) 'maxid'
          FROM TABLE t) max ON t.id BETWEEN max.maxid-100 AND max.maxid
 WHERE t.col = 'xyz' 

对于非连续ids:

代码语言:javascript
复制
SELECT a.*
  FROM (SELECT t.*,
               @rownum := @rownum+1 AS rownum
          FROM TABLE t, (SELECT @rownum := 0) r
         WHERE t.col = 'xyz') a,
       (SELECT COUNT(t.*) 'max'
          FROM TABLE t
         WHERE t.col = 'xyz') m
WHERE a.rownum BETWEEN m.max-100 AND m.max
票数 3
EN

Stack Overflow用户

发布于 2009-08-27 12:30:29

如果对表使用MyISAM,则在(col, id)上创建复合索引。

InnoDB中,PRIMARY KEY作为行指针隐式地包含在表中,因为InnoDB表是按索引组织的。

对于InnoDB,要在(col, id)上创建一个复合索引,只需在col上创建一个索引并确保idPRIMARY KEY即可。

此索引将用于过滤col和按id排序。

索引是一种B-Tree结构,因此它可以以相同的效率迭代ASCDESC

票数 1
EN

Stack Overflow用户

发布于 2009-08-27 12:28:35

您的id列应该设置为主键(或者,如果您有其他主键,则无论如何都应该在其上放置一个索引)。这应该会使查询速度相当快。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1340732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档