› 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 · Apr 1, 2017 · 6831 views
    This topic created in 3503 days ago, the information mentioned may be changed or developed.

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

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