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
Tianpu
V2EX  ›  MySQL

select * 与 select `colum`

  •  
  •   Tianpu · 2012-03-24 01:39:03 +08:00 · 4743 次点击
    这是一个创建于 4627 天前的主题,其中的信息可能已经有所发展或是发生改变。
    发现一次查询很多条数据,如造地图的时候在1000万的表一次查5万,反而是select `colum`快些
    13 条回复    1970-01-01 08:00:00 +08:00
    Tianpu
        1
    Tianpu  
    OP
       2012-03-24 01:44:32 +08:00
    收回上述言论 应该是这样子的
    1000万表有11G大小 则5万有45M左右 一次处理这么大量的数据导致mysql通讯或者php部分处理过慢导致效果不佳 只取一个列 查询慢一点 数据量小的多 才造成这样的现象
    leiz
        2
    leiz  
       2012-03-24 02:03:34 +08:00
    @Tianpu 突然想起来,v2ex好像不太多关于mysql大数据的经验讨论。
    一直对这方面还是比较有兴趣的。如果能有大牛分享这方面的经验,万分期待。
    Tianpu
        3
    Tianpu  
    OP
       2012-03-24 02:46:55 +08:00
    期待分享 我的数据库都很小 正需要大数据库的经验分享
    ayanamist
        4
    ayanamist  
       2012-03-24 10:00:16 +08:00
    用星号和用具体column名字在MySQL本地查询是一样的,column是查询星号的结果裁剪出来的。所以主要是网络传输数据量的差异。
    chuck911
        5
    chuck911  
       2012-03-24 10:03:27 +08:00
    select id 比 select * 快
    annielong
        6
    annielong  
       2012-03-24 11:07:32 +08:00
    怎么说也是 select * 取回全部字段的所有值,而 select id 只取回id一个字段的所有值,肯定体积和速度不一样的
    avatasia
        7
    avatasia  
       2012-03-24 12:16:41 +08:00
    这个是基本功啊, 一般都是不建议使用select *的, @ayanamist 你说话有依据么?
    Tianpu
        8
    Tianpu  
    OP
       2012-03-24 19:22:30 +08:00
    我用到的都是所有字段差不多用完那样子 select * 查询分析器应该没问题吧

    http://stackoverflow.com/questions/3639861/why-is-select-considered-harmful


    对select * 这么有信心, 应该是select count(*)以前感觉比较快
    http://stackoverflow.com/questions/8221729/mysql-select-count-or-select-1-pdo

    所有这些我会在玩些时候测试个150万的样本看下

    以便彻底解决掉这个问题
    Johnny
        9
    Johnny  
       2012-03-24 20:16:07 +08:00
    索引万岁!
    Tianpu
        10
    Tianpu  
    OP
       2012-03-25 14:29:09 +08:00
    @avatasia @leiz

    Table:
    id primary
    abbr unique 96
    name string 128
    meta string 512

    1610000行数据

    select count(`column`) as `count` from `table` limit 1234567,18;
    select count(1) as `count` from `table` limit 1234567,18;
    select count(*) as `count` from `table` limit 1234567,18;

    1最慢,2 3 基本一样的速度

    slect * from `table` limit 1234567,18;
    slect `id`,`abbr` from `table` limit 1234567,18;
    slect `id`,`abbr`,`name`,`meta` from `table` limit 1234567,18;

    2大约是1 3的0.6时间
    1 3 没有明显差异

    应该就是stackoverflow的说法,如果超过2/3字段需要用到 那就使用*好了 如果不是考虑指定字段

    不指定任何查询条件 where 1与空where没有观察到差别

    话说回来 只查ID的情况数据比较多可以考虑ID和别的关系单独做个表 那样更快些 反倒是空条件数据比较多是个麻烦 limit a,b还是不够快

    因此我觉得除非需要的字段很少或者数据量大的足以阻塞通信 * 永远是个不错的选择
    clowwindy
        11
    clowwindy  
       2012-03-25 16:31:35 +08:00
    海量非结构化数据,可以考虑不用数据库
    Tianpu
        12
    Tianpu  
    OP
       2012-03-26 00:20:27 +08:00
    @clowwindy 只用key查询 速度还是不错的 但加上任何条件就不行了

    毕竟mysql部署成本极低 迁移到别的平台难免有这样那样的问题 我最多用到的才1.2亿条 mysql尚可满足需求
    napoleonu
        13
    napoleonu  
       2012-03-26 11:25:55 +08:00
    一般建议 select `colum` 而不是 select *,节约磁盘io和网络io。特别是磁盘io的因素。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2743 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 116ms · UTC 12:14 · PVG 20:14 · LAX 04:14 · JFK 07:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.