V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
skyboy
V2EX  ›  问与答

SQL 语句的执行时间太久

  •  
  •   skyboy · 2016-12-03 16:27:09 +08:00 · 2798 次点击
    这是一个创建于 2914 天前的主题,其中的信息可能已经有所发展或是发生改变。

    请问 SQL 语句执行时间大于多少秒,对于 PHP 页面和用户无意义 。就是说 SQL 的执行时间最好控制在多少秒以内才合适。好像在几千万记录的表中,只有直接查询索引字段,用=号,才能秒级返回,像下面的稍微复杂点的 SQL 语句,其中 name 字段已经做过索引了,但是就要几十秒才返回,这样的 SQL 还有意义吗。我用 php 命令: php test.php 测试执行的 php 文件代码。 select * from students where name=(select name from students order by id desc limit 1)

    8 条回复    2016-12-04 00:41:14 +08:00
    buxingjie
        1
    buxingjie  
       2016-12-03 17:23:27 +08:00
    你的语句和 select * from students order by id desc limit 1 有什么区别
    zhaohui318
        2
    zhaohui318  
       2016-12-03 17:27:48 +08:00
    id 有索引吗?
    shiny
        3
    shiny  
       2016-12-03 20:03:20 +08:00 via iPhone
    不至于这么慢,可以贴 explain 的结果
    akira
        4
    akira  
       2016-12-03 20:51:37 +08:00
    order by id desc limit 1 的话,可以试试直接取 max(id)
    billlee
        5
    billlee  
       2016-12-03 23:54:56 +08:00
    你的 name 没索引吧?另外在字符串类型上做 JOIN 是效果比较差的,最好避免
    还有,除非确定子查询的方式能比 JOIN 快,能写成 JOIN 的操作不要写成子查询,数据库很难对子查询做优化。
    至于 SQL 语句的执行时间多长能接受,你想想自己浏览网页的时候能等多久就知道了,一般也就 3 到 5 秒吧。
    正常情况下执行一个简单查询应该是 < 1 s 的, MongoDB 的默认慢查询日志阈值是 100 ms.
    rogwan
        6
    rogwan  
       2016-12-04 00:14:49 +08:00 via Android
    大数据量的查询,最好还是要异步执行吧。除非用户对数据结果返回又要快,又要极高的实时性,否则,为每个用户 5 分钟异步查询好队列, redis 缓存着待用户来取。社交类的 newsfeed 基本上都是这样搞的,临时查数据,没人吃的消
    ivvei
        7
    ivvei  
       2016-12-04 00:16:26 +08:00
    为什么要查两遍……
    iyaozhen
        8
    iyaozhen  
       2016-12-04 00:41:14 +08:00
    不应该呀,一楼的 [select * from students order by id desc limit 1] 应该非常快
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1033 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 22:33 · PVG 06:33 · LAX 14:33 · JFK 17:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.