V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
JiaFeiX
V2EX  ›  问与答

是真的吗? Linux 下 mysql 使用 localhost 比 127.0.0.1 快

  •  
  •   JiaFeiX · Nov 15, 2016 via iPhone · 5530 views
    This topic created in 3456 days ago, the information mentioned may be changed or developed.
    在 码农翻身 公众号上,看到如下信息:

    [有意思的例外就是 mysql , 在 Linux 上, 当你使用 localhost 来连接数据库的时候, Mysql 会使用 Unix domain socket 来传输数据, 这种方式会快一些, 因为这是一种进程内通信(IPC)机制, 不走网络协议栈, 不需要打包拆包, 计算校验和,维护序号等操作。
    当你使用 127.0.0.1 的时候, mysql 还是会使用 TCP/IP 协议栈来进行数据传输。]

    请问这一描述是真的吗?
    20 replies    2016-11-16 07:03:31 +08:00
    choury
        1
    choury  
       Nov 15, 2016 via Android
    理论上是,但是实际上现在 linux 下面 127.0.0.1 也不走 tcp 了,关键是本机跑的话瓶颈真的在网络?
    uxstone
        2
    uxstone  
       Nov 15, 2016
    都 localhost 了,在乎这点速度?
    lhbc
        3
    lhbc  
       Nov 15, 2016 via iPhone
    1. localhost=127.0.0.1

    /etc/hosts
    127.0.0.1 localhost

    2. lo 口已经不走 TCP/IP
    JiaFeiX
        4
    JiaFeiX  
    OP
       Nov 15, 2016
    @choury [现在 linux 下面 127.0.0.1 也不走 tcp ] 请问这个是从哪个版本变更的? 是内核某个版本变更的吗?
    panda1001
        5
    panda1001  
       Nov 15, 2016 via Android
    读 hosts 的时间算不算
    jarlyyn
        6
    jarlyyn  
       Nov 15, 2016
    一般走 localhost 的话是走 socket 套接字,不走 tcp/ip.
    kslr
        7
    kslr  
       Nov 15, 2016 via Android
    这些公众号真是抄来抄去的。
    ms2008
        8
    ms2008  
       Nov 15, 2016   ❤️ 4
    是对的,但是仅限使用 MySQL 自己的客户端连接

    你如果使用 php 或者其他语言,其实还是要走 tcp 的

    http://dev.mysql.com/doc/refman/5.7/en/connecting.html

    > On Unix, MySQL programs treat the host name localhost specially, in a way that is likely different from what you expect compared to other network-based programs. For connections to localhost, MySQL programs attempt to connect to the local server by using a Unix socket file. This occurs even if a --port or -P option is given to specify a port number.
    herozzm
        9
    herozzm  
       Nov 15, 2016 via Android
    /etc/hosts 里面内容怎么解释
    wwqgtxx
        10
    wwqgtxx  
       Nov 15, 2016 via iPhone
    @herozzm 他都不走 tcp/ip 栈,谁还管你 host 文件
    Zzzzzzzzz
        11
    Zzzzzzzzz  
       Nov 15, 2016
    @ms2008 php 自己搞的 mysqlnd 用 localhost 也是走 unix socket 的
    JiaFeiX
        12
    JiaFeiX  
    OP
       Nov 15, 2016
    @ms2008 文档看到了,非常感谢。 on UNIX 情况明了了。 其他语言的客户端,走 TCP ,请问这一句的来源是?
    jarlyyn
        13
    jarlyyn  
       Nov 15, 2016
    @herozzm

    这和 hosts 没关系。

    mysql 客户端默认用 localhost 的话走套接字。

    最典型的是,如果客户端配置不对的话,通过 127.0.0.1 因为是走 3306 端口,可以正常访问,而走 localhost 由于走套接字,接口文件路径错误,会无法连接。

    与解析没关系。
    phoenixlzx
        14
    phoenixlzx  
       Nov 15, 2016 via iPhone
    其他客户端走不走 socket 要看实现了吧...
    ms2008
        15
    ms2008  
       Nov 15, 2016
    @JiaFeiX 我说的

    其实区别是通过 domain socket 还是走 TCP ,只需要 show processlist; 就能看出来

    只要 host 那列是这种格式 localhost:24673 ,后面又端口的,都是 TCP

    domain socket 的话只会显示 localhost
    cnscud
        16
    cnscud  
       Nov 15, 2016
    有意思... 公司穷的只有一台服务器了?
    lslqtz
        17
    lslqtz  
       Nov 15, 2016
    有 hosts 时使用当然用 hosts...
    mysql 客户端用啥 jarlyyn 说的很清楚了。。
    有 hosts php 就根据 hosts 来走咯。。
    xjp
        18
    xjp  
       Nov 15, 2016 via iPhone
    是的 所以使用 localhost 的时候会忽略端口号 不信你试试 改端口看看 都能连上
    Joway
        19
    Joway  
       Nov 15, 2016   ❤️ 1
    靠这种底层细微的优化其实根本无意义, 你优化完了这个, 还有调整内核参数, 调整各种调度算法等等一系列优化呢 , 然而这种东西再怎么优化,上层代码写得差还是全毁了
    eyp82
        20
    eyp82  
       Nov 16, 2016   ❤️ 1
    做优化的一个大前提, 是先对性能指标进行测量, 找到最该优化的环节.
    在这个场景下, 很多时候性能瓶颈在 I/O, 本机即使走 TCP/IP 协议栈, 以 CPU 的速度, 拆包打包的速度甩 I/O 一万条街不止.
    所以, 其实是个伪命题...
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   879 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 54ms · UTC 22:52 · PVG 06:52 · LAX 15:52 · JFK 18:52
    ♥ Do have faith in what you're doing.