首页   注册   登录
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
V2EX  ›  MySQL

MySQL 分页查询性能比较

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

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

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