用户
 找回密码
 入住 CI 中国社区
搜索
楼主: pp18180058
收起左侧

[数据库] Hex来~~mysql查询优化问题

[复制链接]
发表于 2009-2-17 15:30:53 | 显示全部楼层
MYSQL的优化是非常重要的。其他最常用也最需要优化的就是limit。mysql的limit给分页带来了极大的方便,但数据量一大的时候,limit的性能就急剧下降。

同样是取10条数据

select * from yanxue8_visit limit 10000,10



select * from yanxue8_visit limit 0,10

就不是一个数量级别的。

网上也很多关于limit的五条优化准则,都是翻译自mysql手册,虽然正确但不实用。今天发现一篇文章写了些关于limit优化的,很不错。

文中不是直接使用limit,而是首先获取到offset的id然后直接使用limit size来获取数据。根据他的数据,明显要好于直接使用limit。这里我具体使用数据分两种情况进行测试。(测试环境win2033+p4双核(3GHZ) +4G内存 mysql 5.0.19)

1、offset比较小的时候。


select * from yanxue8_visit limit 10,10

多次运行,时间保持在0.0004-0.0005之间


Select * From yanxue8_visit Where vid >=(
Select vid From yanxue8_visit Order By vid limit 10,1
) limit 10

多次运行,时间保持在0.0005-0.0006之间,主要是0.0006
结论:偏移offset较小的时候,直接使用limit较优。这个显然是子查询的原因。

2、offset大的时候。

select * from yanxue8_visit limit 10000,10

多次运行,时间保持在0.0187左右

Select * From yanxue8_visit Where vid >=(
Select vid From yanxue8_visit Order By vid limit 10000,1
) limit 10
发表于 2009-2-19 22:08:56 | 显示全部楼层
select ID,title from pp_news order by pubdate desc limit 2370000,30 这个查询要全表扫描可费时间了~~

我怎么写SQL语句,才能查询到与上面语句一样的结果?
pp18180058 发表于 2008-12-5 05:20

针对这个查询,只应该为pubdate建一个索引就行。建索引和select 的列没有多大关系,而是要看where的条件和order by的字段等。索引不能随意建,因为索引是有代价的。另外,如果pubdate是date类型比文本类型要好,因为检索数字类型比文本类型要快得多。
发表于 2009-8-14 12:36:21 | 显示全部楼层
以下是我个人的优化建议:
你将pubdate在数据库中的类型设置成unsigned INT(10)存时间戳,然后再这个栏位上建立一个索引。然后重新试试。(SQL语句不变,就是LZ的第一条语句)

然后用EXPLAIN看看语句order by用的是using file sort,还是using index。如果是后者,那就达到目标了。

评分

参与人数 1威望 +3 收起 理由
Hex + 3 高手!

查看全部评分

发表于 2009-12-29 21:49:18 | 显示全部楼层
联合索引
发表于 2010-1-20 05:54:51 | 显示全部楼层
这个...缓存吧
发表于 2010-9-28 06:41:20 | 显示全部楼层
单表查询啊。
就是limit的数量太大了

这个limit值用在什么地方啊。要那么多,这不是分页专用的么。
发表于 2010-12-3 18:21:52 | 显示全部楼层
建议你了解一下dmz,我想会对你的数据库有很大帮助的
http://www.overzealous.com/dmz
发表于 2011-1-4 16:43:08 | 显示全部楼层
我想如果是这么多数据的话,例如每次循环100条数据,然后循环查询输出这样会好很多,为什么要一下就看出这么多数据呢?希望对你有帮助
发表于 2011-1-9 01:44:50 | 显示全部楼层
20楼,强人!说的明白!

23楼,牛!顶
发表于 2011-1-13 22:23:07 | 显示全部楼层
假设id是自动增长的,中间你也没删除数据的话。这样可以否?
SQL复制代码
SELECT title FROM article LIMIT 1000,10
复制代码

SQL复制代码
SELECT title FROM article WHERE id>1000 LIMIT 10
复制代码

本版积分规则