现在在本地数据库中建了一个ip数据库,在id字段上建了索引,现在执行以下语句来分页查询(输入到pl/sql中),发现特慢
SELECT * FROM tbl_ip_address t1 WHERE
(SELECT count(*) FROM tbl_ip_address t2 WHERE t2.id < t1.id ) > = 10
AND (SELECT count(*) FROM tbl_ip_address t2 WHERE t2.id < t1.id ) < 20
共51000条记录,id建了索引,花时597s
问题出在哪儿?如何调优?请高手指点
SELECT * FROM tbl_ip_address t1 WHERE
(SELECT count(*) FROM tbl_ip_address t2 WHERE t2.id < t1.id ) > = 10
AND (SELECT count(*) FROM tbl_ip_address t2 WHERE t2.id < t1.id ) < 20
共51000条记录,id建了索引,花时597s
问题出在哪儿?如何调优?请高手指点
一般情况下,分页都是用的这个.
这是因为它是伪列
你可这样子生成一列rownum rn 这样就可以>了
你这里面几个问题
select * 这种尽量少用,特别是表中有许多字段,尽可能只取需要的字段
后面的count(*) 这样一弄,你的索引没有用到,还是全表扫描,尽可能用count(索引字段)
其实分页一般都是用rownum要比你这有效率
我试着改一下,你再去试试效率
select a.*
from (
SELECT t1.*,rownum rn FROM tbl_ip_address t1 order by t1.id
)
where rn >=10 and rn<=19
select a.*
from (
SELECT t1.*,rownum rn FROM tbl_ip_address t1 order by t1.id
) a
where rn >=10 and rn <=19
http://blog.sina.com.cn/s/blog_511846a201008sbu.html