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

mysql select * 与 select 具体字段 到底哪个快?

  •  1
     
  •   tinyTot · 2021-12-09 14:21:52 +08:00 · 3874 次点击
    这是一个创建于 862 天前的主题,其中的信息可能已经有所发展或是发生改变。

    mysql select * 与 select 具体字段 到底哪个快?自己测试的时候都是 select * 快

    第 1 条附言  ·  2021-12-10 18:07:46 +08:00
    1 、order by created_at 与 order by id
    http://tva1.sinaimg.cn/large/0061WS1kly1gx8vyymc6zj31b0030dgm.jpg
    http://tva1.sinaimg.cn/large/0061WS1kly1gx8w0ezqq6j31f80300tp.jpg

    2 、select * 与 select 字段 (同样 order by id)
    http://tva1.sinaimg.cn/large/0061WS1kly1gx8vyymc6zj31b0030dgm.jpg

    没有区别

    最终优化结果:order by created_at 改为 order by id; select * 改为 select 具体字段

    感谢各位大佬。
    19 条回复    2021-12-09 21:07:38 +08:00
    Alchemistboy
        1
    Alchemistboy  
       2021-12-09 14:25:56 +08:00
    你的 [具体字段] 如果有索引,where 里面用这个索引查询,不用回表,会更快
    zxxufo008
        2
    zxxufo008  
       2021-12-09 14:28:03 +08:00
    你测试的数据量有多少呢,字段有多少个呢?
    labulaka521
        3
    labulaka521  
       2021-12-09 14:32:04 +08:00
    这要看索引吧
    tinyTot
        4
    tinyTot  
    OP
       2021-12-09 14:36:31 +08:00
    字段一共 15 个; 数据量 80 万左右; sql 里面只有主键索引;
    order by id 不如 order by created_at 快
    select * 比 select 具体字段快
    不知道是不是 select * mysql 有相关查询缓存的原因

    SELECT `id`, `no`, `amount`, `type`, `note`, `created_at` FROM `charge` WHERE `uid` = 11 ORDER BY `created_at` DESC LIMIT 15 OFFSET 0;

    SELECT * `charge` WHERE `uid` = 11 ORDER BY `id` DESC LIMIT 15 OFFSET 0;
    westoy
        5
    westoy  
       2021-12-09 14:39:48 +08:00
    原则上肯定是后面那个啊, 后面那个就算不走索引, 前面那个也包含了这些无索引的字段, 一样快不了的

    但是如果每次查询的字段不一样,但是都只是差在小字段上, 前面那个命中 query cache 的概率更高一点, 这样反而会反杀后面那个
    tinyTot
        6
    tinyTot  
    OP
       2021-12-09 15:05:16 +08:00
    show variables like '%query_cache%';

    have_query_cache YES
    query_cache_limit 1048576
    query_cache_min_res_unit 4096
    query_cache_size 0
    query_cache_type OFF
    query_cache_wlock_invalidate OFF



    show status like 'Qcache%';

    Qcache_free_blocks 0
    Qcache_free_memory 0
    Qcache_hits 0
    Qcache_inserts 0
    Qcache_lowmem_prunes 0
    Qcache_not_cached 5036
    Qcache_queries_in_cache 0
    Qcache_total_blocks 0
    cheng6563
        7
    cheng6563  
       2021-12-09 15:33:01 +08:00
    请问 select * 和 SELECT * 哪个块?
    tinyTot
        8
    tinyTot  
    OP
       2021-12-09 15:57:57 +08:00
    1 、指定的 uid 数据量在 300 条时,经常查询的一个用户,指定字段的速度=0.122; * 的速度=0.217
    1 、指定的 uid 数据量在 300 条时,不经常查询的一个用户,指定字段的速度=0.311; * 的速度=0.210
    2 、指定的 uid 数据量在小于 15 条时,不经常查询的一个用户,指定字段的速度=0.456; * 的速度=0.217

    在增加 uid 的索引后,两条 sql 查询时间 大致都在 0.02x

    考虑到还有网络传输,最终决定还是指定字段查询

    不过对于这个问题还是有点疑惑
    weizhen199
        9
    weizhen199  
       2021-12-09 16:00:45 +08:00
    select 某个字段恒<= select * 的速度
    qq1340691923
        10
    qq1340691923  
       2021-12-09 16:02:10 +08:00
    列式存储数据库就可以看出明显差异了
    MonkeyJon
        11
    MonkeyJon  
       2021-12-09 16:15:13 +08:00
    explain 你的 sql ,分析执行计划,看用到的索引和查询条数
    weizhen199
        12
    weizhen199  
       2021-12-09 16:16:38 +08:00
    @qq1340691923 数据结构不一样,这两个放在一起比较很不公平的
    onhao
        13
    onhao  
       2021-12-09 16:52:58 +08:00
    select 具体字段
    不接受反驳!

    #8 还要考虑到返回的数据量 ,还有就是 * 和具体字段 ,执行速度(时间)要排除缓存的因素,在数据量大的情况下最好是指定字段 ,如果是单条数据 ,无所谓

    mysql 函数的应用 不知楼主有兴趣了解下不 https://wuhao.pw/archives/277/
    @tinyTot
    tabris17
        14
    tabris17  
       2021-12-09 16:57:16 +08:00
    select 具体字段比 select *只快不慢
    如果覆盖索引速度会非常快
    xsm1890
        15
    xsm1890  
       2021-12-09 17:28:36 +08:00   ❤️ 1
    select 字符按和 select * 在查询过程的主要区别在于数据页加再到内存后到返回客户端间的这段时间的区别;即为网络传输时间和决定具体返回的数据的时间之和的差别。网络传输毫无疑问 select *>=select 字段;由于数据页的结构是一个 稀疏目录,只能顺序查找,所以根据返回的具体数据的区别,select *所需的时间可能更快(返回整页数据的时候)也可能 能更慢。
    所以具体谁更快?还真不好说。
    RedBeanIce
        16
    RedBeanIce  
       2021-12-09 18:46:05 +08:00 via iPhone
    请了解 explain ,覆盖索引,以及 sql 代码*和字段的兼容性
    akira
        17
    akira  
       2021-12-09 19:21:04 +08:00
    字段数量少,总长小的时候 没啥区别。 字段数量或者总长度上去以后,select * 能让你怀疑人生
    akira
        18
    akira  
       2021-12-09 19:22:17 +08:00
    另外,select 具体字段 应该是规范要求,一般开发都不会允许使用 select *的吧
    msaionyc
        19
    msaionyc  
       2021-12-09 21:07:38 +08:00 via iPhone
    去学下索引吧,不然大家说再多你也还是听不明白
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1087 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 23:23 · PVG 07:23 · LAX 16:23 · JFK 19:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.