Sau*_*tel 11 mysql sql query-optimization
我在MySQL中有1000万行表,2 GB数据选择IN LIFO格式数据很慢
表引擎是=InnoDB
table有一个主键和一个唯一键
SELECT * FROM link LIMIT 999999 , 50;
Run Code Online (Sandbox Code Playgroud)
我如何提高表的性能.?
表结构
id int(11) NO PRI NULL auto_increment
url varchar(255) NO UNI NULL
website varchar(100) NO NULL
state varchar(10) NO NULL
type varchar(100) NO NULL
prio varchar(100) YES NULL
change varchar(100) YES NULL
last varchar(100) YES NULL
Run Code Online (Sandbox Code Playgroud)
注意:
SELECT * FROM link LIMIT 1 , 50;
正在采取,.9ms
但目前的SQL正在花费1000ms
100倍的时间
这很可能是由于"早期行查找"
可以强制MySQL进行"后期行查找".请尝试以下查询
SELECT l.*
FROM (
SELECT id
FROM link
ORDER BY
id
LIMIT 999999 , 50
) q
JOIN link l
ON l.id = q.id
Run Code Online (Sandbox Code Playgroud)
看看这篇文章
对于Next和Prev按钮,您可以使用WHERE
子句代替OFFSET
.
示例(使用LIMIT 10
- 下面说明的示例数据):您在某个页面上显示带有ID的10行[2522,2520,2514,2513,2509,2508,2506,2504,2497,2496]
.在我的情况下这是创建的
select *
from link l
order by l.id desc
limit 10
offset 999000
Run Code Online (Sandbox Code Playgroud)
对于下一页,您将使用
limit 10
offset 999010
Run Code Online (Sandbox Code Playgroud)
获取带有ID的行[2495,2494,2493,2492,2491,2487,2483,2481,2479,2475]
.
对于您将使用的上一页
limit 10
offset 998990
Run Code Online (Sandbox Code Playgroud)
获取带有ID的行[2542,2541,2540,2538,2535,2533,2530,2527,2525,2524]
.
以上所有查询都在500毫秒内执行.使用Sanj建议的"技巧"仍然需要250毫秒.
现在,与给定的页面minId=2496
和maxId=2522
我们可以创建查询下一步和最后使用按钮WHERE
条款.
下一步按钮:
select *
from link l
where l.id < :minId -- =2496
order by l.id desc
limit 10
Run Code Online (Sandbox Code Playgroud)
结果ID : [2495,2494,2493,2492,2491,2487,2483,2481,2479,2475]
.
上一个按钮:
select *
from link l
where l.id > :maxId -- =2522
order by l.id asc
limit 10
Run Code Online (Sandbox Code Playgroud)
结果ID : [2524,2525,2527,2530,2533,2535,2538,2540,2541,2542]
.
要颠倒顺序,您可以在子选择中使用查询:
select *
from (
select *
from link l
where l.id > 2522
order by l.id asc
limit 10
) sub
order by id desc
Run Code Online (Sandbox Code Playgroud)
结果ID : [2542,2541,2540,2538,2535,2533,2530,2527,2525,2524]
.
这些查询在"没有时间"(小于1毫秒)内执行并提供相同的结果.
您无法使用此解决方案来创建页码.但我认为你不会输出200K的页码.
测试数据:
用于示例和基准测试的数据已创建
CREATE TABLE `link` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`url` VARCHAR(255) NOT NULL,
`website` VARCHAR(100) NULL DEFAULT NULL,
`state` VARCHAR(10) NULL DEFAULT NULL,
`type` VARCHAR(100) NULL DEFAULT NULL,
`prio` VARCHAR(100) NULL DEFAULT NULL,
`change` VARCHAR(100) NULL DEFAULT NULL,
`last` VARCHAR(100) NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `url` (`url`)
) COLLATE='utf8_general_ci' ENGINE=InnoDB;
insert into link
select i.id
, concat(id, '-', rand()) url
, rand() website
, rand() state
, rand() `type`
, rand() prio
, rand() `change`
, rand() `last`
from test._dummy_indexes_2p23 i
where i.id <= 2000000
and rand() < 0.5
Run Code Online (Sandbox Code Playgroud)
哪个test._dummy_indexes_2p23
是包含2 ^ 23个ID(约8M)的表.因此,数据包含每隔一个id随机丢失的大约1M行.表大小:228 MB
归档时间: |
|
查看次数: |
1623 次 |
最近记录: |