V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
zioc
V2EX  ›  MySQL

MySQL 分页查询性能比较

  •  
  •   zioc · 2017-04-01 10:14:43 +08:00 · 5296 次点击
    这是一个创建于 2821 天前的主题,其中的信息可能已经有所发展或是发生改变。

    请问这两种写法哪一种好呢?

    SELECT * FROM API_LOG a JOIN (select ID from API_LOG LIMIT 0, 10) b ON a.ID = b.ID

    SELECT * FROM API_LOG WHERE ID IN ( SELECT * FROM (SELECT ID FROM API_LOG LIMIT 0, 10) t)

    24 条回复    2017-04-17 07:12:27 +08:00
    8355
        1
    8355  
       2017-04-01 10:19:20 +08:00
    没太看懂你写的 sql
    不过问性能来说你运行一下就知道了啊.
    AlisaDestiny
        2
    AlisaDestiny  
       2017-04-01 10:19:31 +08:00
    这个你可以自己测下的。表里插入 1W 假数据。每个 sql 语句执行十次。看平均时间。
    killerv
        3
    killerv  
       2017-04-01 10:22:25 +08:00 via iPhone
    mysql 子查询比较坑,慎重使用。
    zioc
        4
    zioc  
    OP
       2017-04-01 10:29:31 +08:00
    @killerv 确实
    @8355
    @AlisaDestiny
    测了 第一种快很多
    8355
        5
    8355  
       2017-04-01 10:32:38 +08:00
    @zioc #4 可我觉得 join 更加坑. 可能你测试的数据量还没到
    zioc
        6
    zioc  
    OP
       2017-04-01 10:33:41 +08:00
    @8355 几万条吧 满足需要了
    JKeita
        7
    JKeita  
       2017-04-01 10:47:58 +08:00
    explain 一下看了下查询,应该是第一条比较快
    surfire91
        8
    surfire91  
       2017-04-01 10:50:26 +08:00
    恕我眼拙,这个跟 SELECT * FROM API_LOG LIMIT 0, 10 有啥区别
    fxxkgw
        9
    fxxkgw  
       2017-04-01 10:55:58 +08:00
    没看懂 但是慎用笛卡尔积
    raycloud
        10
    raycloud  
       2017-04-01 10:58:14 +08:00
    @surfire91 #8 +1 ,没看懂为什么要写的这么复杂
    qfdk
        11
    qfdk  
       2017-04-01 11:33:11 +08:00 via iPhone
    加个 index 有想不到的结果
    zander1024
        12
    zander1024  
       2017-04-01 12:29:37 +08:00
    我不懂这个 Join 有卵用?.. 可能是我 mysql 学的假的
    AnonymousAccout
        13
    AnonymousAccout  
       2017-04-01 12:33:54 +08:00 via iPhone
    好吧 第二个里的子查询那个 select * from 也没用吧...
    sujin190
        14
    sujin190  
       2017-04-01 13:00:34 +08:00
    WHERE IN 又子查询在 mysql 上的实现似乎是上一级的查询的每一条数据做一次子查询, mysql 文档上似乎有详细解释,可以去看下,我记得是这么写的,还是用第一种好
    luckyduck
        15
    luckyduck  
       2017-04-01 13:03:16 +08:00
    楼上看不懂的是因为不了解什么叫覆盖索引。。。
    sujin190
        16
    sujin190  
       2017-04-01 13:11:35 +08:00
    danielmiao
        17
    danielmiao  
       2017-04-01 13:17:14 +08:00
    不理解这么做的意义。。是吧 mysql 优化器当傻 bi ~~~~了么
    surfire91
        18
    surfire91  
       2017-04-01 13:17:18 +08:00
    @luckyduck 覆盖索引跟楼主说的 SQL 有什么关系,可否明示?
    zioc
        19
    zioc  
    OP
       2017-04-01 14:06:09 +08:00   ❤️ 1
    @surfire91
    @raycloud
    直接 limit 数据量偏移大了会变慢,这个是偏移 ID 主键
    @AnonymousAccout 加 SELECT * FROM 是 MySQL 不允许 Limit IN 在子查询里面
    realpg
        20
    realpg  
       2017-04-01 18:51:37 +08:00
    如果不做特殊 CACHE 标记,测试只有第一次有意义……
    satifanie
        21
    satifanie  
       2017-04-02 16:14:38 +08:00
    单看 也看不出来。 不如直接 Explain 一下。看一下 分析的结果就知道了
    luckyduck
        22
    luckyduck  
       2017-04-03 19:17:57 +08:00
    @surfire91 覆盖索引的意思就是指直接通过索引的查询就能获取到数据。例如: select id from table 这个 id 是主键,仅仅通过索引查询就能返回结果, select * from table 这里则需要先查到主键,再通过主键获取剩余字段的值,这也就是为什么前者比后者快。
    panzhc
        23
    panzhc  
       2017-04-05 18:56:26 +08:00
    garodie
        24
    garodie  
       2017-04-17 07:12:27 +08:00 via iPhone
    现代陈世美,良心被狗吃了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2800 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 06:23 · PVG 14:23 · LAX 22:23 · JFK 01:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.