作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
因此,如果我不使用 order by
,我对包含 400 万
记录的表的查询会立即执行。不过,我想为我的客户提供一种按 Name
字段对结果进行排序的方法,并且仅显示过滤结果的最后 100
。一旦我添加order by Name
,执行就需要 100 秒。
我的表结构与此类似:
CREATE TABLE Test(
ID INT PRIMARY KEY AUTO_INCREMENT,
Name VARCHAR(100),
StatusID INT,
KEY (StatusID), <-- Index on StatusID
KEY (StatusID, Name) <-- Index on StatusID, Name
KEY(Name) <-- Index on Name
);
我的查询只是执行以下操作:
explain SELECT ID, StatusID, Name
FROM Test
WHERE StatusID = 113
ORDER BY Name DESC
LIMIT 0, 100
上面解释了当我按Name
订购时给出的结果:
StatusID_2
是 StatausID, Name
的复合索引
现在,如果我将 ORDER BY Name DESC
更改为 ORDER BY ID
我会得到:
如何才能使其在使用 ORDER BY Name
时仅检查 100
行?
最佳答案
您可以尝试一件事,尝试查找结果中预期位于 100 行的字母
SELECT *
FROM Test
*** Some Joins to filter data or get more columns from other tables
WHERE StatusID = 12 AND NAME REGEXP '^[A-H]'
ORDER BY Name DESC
LIMIT 0, 100
此外,使用索引对于名称(已应用)非常重要 - 在这种情况下,一旦生成所需的行数,就会启动索引范围扫描并停止查询执行。
所以我们不能无用地使用ID,因为当它达到极限时它不会扫描,我们唯一可以尝试的就是删除在预期结果中不可能的字母,这就是我们正在尝试做的使用正则表达式
关于如果使用 ORDER BY 字符串列,MySQL 查询需要很长时间才能执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26288213/
我是一名优秀的程序员,十分优秀!