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

phpmyadmin 打开一张有一亿条数据的表经常 504 怎么办

  •  
  •   chenqh · 2017-02-11 14:25:47 +08:00 · 3174 次点击
    这是一个创建于 2872 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这张表可以説成一个日志表,表结构类似(用户 id,用户当前经验,用户变更经验值,用户变更经验值类型,创建时间), 有一亿条数据, 总共大小 12.6G. 对用户 id 做了索引,索引 1.6G

    第 1 条附言  ·  2017-02-11 16:27:44 +08:00
    知道是什么原因了,是因为 select count(*)的原因,但是想不通啊

    mysql> explain select count(*) from income;
    +----+-------------+--------+-------+---------------+----------------+---------+------+-----------+-------------+
    | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
    +----+-------------+--------+-------+---------------+----------------+---------+------+-----------+-------------+
    | 1 | SIMPLE | income | index | NULL | user_id__itype | 8 | NULL | 109395149 | Using index |
    +----+-------------+--------+-------+---------------+----------------+---------+------+-----------+-------------+
    1 row in set (0.00 sec)
    第 2 条附言  ·  2017-02-11 16:28:27 +08:00
    按理来説 select count(*)不是应该走 主键索引的吗
    第 3 条附言  ·  2017-02-12 11:04:47 +08:00
    命令行好是好,但是没有 phpmyadmin 好看些啊。。
    phpmyadmin 有什么优化的方法吗
    18 条回复    2017-02-12 21:22:21 +08:00
    lhbc
        1
    lhbc  
       2017-02-11 14:33:16 +08:00 via iPhone
    打开是指 select * ?
    chenqh
        2
    chenqh  
    OP
       2017-02-11 15:12:50 +08:00
    @lhbc 在 phpmyadmin 里面点击那张表
    grimpil
        3
    grimpil  
       2017-02-11 15:52:15 +08:00 via Android
    用命令行试试呗
    wudege
        4
    wudege  
       2017-02-11 16:08:40 +08:00
    可以更改 Web Server 和 PHP 执行超时时间;
    [参考]( https://segmentfault.com/a/1190000002686153)
    lhbc
        5
    lhbc  
       2017-02-11 16:43:14 +08:00 via iPhone
    为什么不是 select count(id)?
    select * 任何情况都尽量不要用
    wvidc
        6
    wvidc  
       2017-02-11 17:01:55 +08:00
    分表
    msg7086
        7
    msg7086  
       2017-02-11 17:09:15 +08:00
    就问一句, InnoDB 还是 MyISAM/Aria ?
    chenqh
        8
    chenqh  
    OP
       2017-02-11 18:09:21 +08:00
    @msg7086 innodb
    uzumaki
        9
    uzumaki  
       2017-02-11 20:54:48 +08:00 via Android
    本地用软件试试?
    ferock
        10
    ferock  
       2017-02-11 21:31:31 +08:00 via iPhone
    @lhbc 这个也是不对的
    Felldeadbird
        11
    Felldeadbird  
       2017-02-11 21:59:41 +08:00
    没有条件下,扫全表啊。这个情况还是用命令行吧。
    pathbox
        12
    pathbox  
       2017-02-11 22:02:43 +08:00
    和你的表结构有关, count(*) 不一定就用的主键, 尝试用 count(id) 试试呗
    HLT
        13
    HLT  
       2017-02-11 22:04:24 +08:00
    谁设计的。。。
    mansur
        14
    mansur  
       2017-02-11 22:12:01 +08:00
    你删除过记录就要挨个数了
    gouchaoer
        15
    gouchaoer  
       2017-02-11 23:12:20 +08:00 via Android
    说了半天都没人告诉 lz , select (*)在 myiaam 中是常数级的, innodb 却不是的,至于 select count 一回事。。。走主键索引也是扫表啊。。。。你 explain 不就知道了
    zhtsuc
        16
    zhtsuc  
       2017-02-11 23:18:57 +08:00
    不管是啥,你 select 在一个亿 db 里查询,肯定慢,遇到这种情况,只能分片查询,或者从一开始就分表。
    gam2046
        18
    gam2046  
       2017-02-12 21:22:21 +08:00
    没有 where 语句,何来走索引一说?都没筛选条件,不就是扫全表然后输出么?和 select 啥貌似没啥关系......

    走不走索引不应该是看条件语句么?和查询的字段难道也有关系...
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3131 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 13:00 · PVG 21:00 · LAX 05:00 · JFK 08:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.