我的日常

登录/注册
您现在的位置:论坛 资料库 数据库开发 > Mysql如何优化延迟索引和分页
总共48086条微博

动态微博

查看: 1670|回复: 0

Mysql如何优化延迟索引和分页

[复制链接]

279

主题

41

听众

689

金钱

版主

该用户从未签到

跳转到指定楼层
楼主
发表于 2014-11-19 12:51:19 |只看该作者 |倒序浏览
什么是延迟索引?使用索引查询出来数据,之后把查询结果和同一张表中数据进行连接查询,进而提高查询速度!

分页是一个很常见功能,select ** from tableName limit ($page - 1 ) * $n ,$n

通过一个存储过程插入10000条数据进行测试:
  1. create table smth1 (
  2.     id int auto_increment ,
  3.     ver int(11) default null,
  4.     content varchar(1000) not null,
  5.     intro varchar(1000) not null,
  6.     primary key(id),
  7.     key idver(id,ver)
  8.      
  9. )engine = innodb default charset = utf8;






  10. create procedure smthTest1()
  11. begin
  12.     declare num int default 100001;
  13.     while num < 1000000 do
  14.         set num := num +1;
  15.         insert into smth1 values (num ,num,'我是*****','我是谁');
  16.     end while ;

  17. end;
复制代码
查询:
  1. mysql> show profiles;
  2. +----------+------------+----------------------------------------------+
  3. | Query_ID | Duration   | Query                                        |
  4. +----------+------------+----------------------------------------------+
  5. |        1 |   0.002006 | select id ,content from smth1 limit 1000,10  |
  6. |        2 |   0.030106 | select id ,content from smth1 limit 5000,10  |
  7. |        3 |   0.042428 | select id ,content from smth1 limit 9000,10  |
  8. |        4 | 0.01297225 | select id ,content from smth1 limit 10000,10 |
  9. |        5 | 0.13077625 | select id ,content from smth1 limit 20000,10 |
复制代码
可见随着查询$page 变大,时间会越来越大!


怎样避免这种情况?

一般我们数据库里面数据都不会直接删除,数据时很宝贵的,不舍得删除,另一方便能提高查询数据

先利用索引查询出来数据,再进行联合查询不就行了

  1. select C.id,C.content from smth1 C inner join
  2. (
  3.     select id from smth1 where id > 1000 limit 10
  4. ) as t on C.id = t.id ;

  5. select C.id,C.content from smth1 C inner join
  6. (
  7.     select id from smth1 where id > 5000 limit 10
  8. ) as t on C.id = t.id ;

  9. select C.id,C.content from smth1 C inner join
  10. (
  11.     select id from smth1 where id > 9000 limit 10
  12. ) as t on C.id = t.id ;

  13. select C.id,C.content from smth1 C inner join
  14. (
  15.     select id from smth1 where id > 10000 limit 10
  16. ) as t on C.id = t.id ;

  17. select C.id,C.content from smth1 C inner join
  18. (
  19.     select id from smth1 where id > 20000 limit 10
  20. ) as t on C.id = t.id ;

  21. 进行执行计划分析,没有一个大于1s的

  22. 11 | 0.04538625 | select C.id,C.content from smth1 C inner join
  23. (
  24.     select id from smth1 where id > 5000 limit 10
  25. ) as t on C.id = t.id  |
  26. |       12 |   0.023278 | select C.id,C.content from smth1 C inner join
  27. (
  28.     select id from smth1 where id > 9000 limit 10
  29. ) as t on C.id = t.id  |
  30. |       13 | 0.02320425 | select C.id,C.content from smth1 C inner join
  31. (
  32.     select id from smth1 where id > 10000 limit 10
  33. ) as t on C.id = t.id |
  34. |       14 |   0.001938 | select C.id,C.content from smth1 C inner join
  35. (
  36.     select id from smth1 where id > 20000 limit 10
  37. ) as t on C.id = t.id |
复制代码
此外,还会想到用in来查询而不是子查询,为什么不用in,使用in会先查询出来一条id,之后再去和下面进行匹配,会进行smth1进行全表扫描!




科帮网 1、本主题所有言论和图片纯属会员个人意见,与本社区立场无关
2、本站所有主题由该帖子作者发表,该帖子作者与科帮网享有帖子相关版权
3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和科帮网的同意
4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
7、科帮网管理员和版主有权不事先通知发贴者而删除本文


JAVA爱好者①群:JAVA爱好者① JAVA爱好者②群:JAVA爱好者② JAVA爱好者③ : JAVA爱好者③

快速回复
您需要登录后才可以回帖 登录 | 立即注册

   

关闭

站长推荐上一条 /1 下一条

发布主题 快速回复 返回列表 联系我们 官方QQ群 科帮网手机客户端
快速回复 返回顶部 返回列表