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

2016-11-15 10:15:21 +08:00
 JiaFeiX
在 码农翻身 公众号上,看到如下信息:

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

请问这一描述是真的吗?
5133 次点击
所在节点    问与答
20 条回复
choury
2016-11-15 10:23:26 +08:00
理论上是,但是实际上现在 linux 下面 127.0.0.1 也不走 tcp 了,关键是本机跑的话瓶颈真的在网络?
uxstone
2016-11-15 10:26:18 +08:00
都 localhost 了,在乎这点速度?
lhbc
2016-11-15 10:42:02 +08:00
1. localhost=127.0.0.1

/etc/hosts
127.0.0.1 localhost

2. lo 口已经不走 TCP/IP
JiaFeiX
2016-11-15 10:48:13 +08:00
@choury [现在 linux 下面 127.0.0.1 也不走 tcp ] 请问这个是从哪个版本变更的? 是内核某个版本变更的吗?
panda1001
2016-11-15 11:33:15 +08:00
读 hosts 的时间算不算
jarlyyn
2016-11-15 11:37:15 +08:00
一般走 localhost 的话是走 socket 套接字,不走 tcp/ip.
kslr
2016-11-15 12:13:06 +08:00
这些公众号真是抄来抄去的。
ms2008
2016-11-15 12:14:39 +08:00
是对的,但是仅限使用 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
2016-11-15 12:16:12 +08:00
/etc/hosts 里面内容怎么解释
wwqgtxx
2016-11-15 14:33:10 +08:00
@herozzm 他都不走 tcp/ip 栈,谁还管你 host 文件
Zzzzzzzzz
2016-11-15 14:37:10 +08:00
@ms2008 php 自己搞的 mysqlnd 用 localhost 也是走 unix socket 的
JiaFeiX
2016-11-15 14:54:45 +08:00
@ms2008 文档看到了,非常感谢。 on UNIX 情况明了了。 其他语言的客户端,走 TCP ,请问这一句的来源是?
jarlyyn
2016-11-15 15:00:07 +08:00
@herozzm

这和 hosts 没关系。

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

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

与解析没关系。
phoenixlzx
2016-11-15 15:20:11 +08:00
其他客户端走不走 socket 要看实现了吧...
ms2008
2016-11-15 15:23:36 +08:00
@JiaFeiX 我说的

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

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

domain socket 的话只会显示 localhost
cnscud
2016-11-15 17:38:05 +08:00
有意思... 公司穷的只有一台服务器了?
lslqtz
2016-11-15 18:28:01 +08:00
有 hosts 时使用当然用 hosts...
mysql 客户端用啥 jarlyyn 说的很清楚了。。
有 hosts php 就根据 hosts 来走咯。。
xjp
2016-11-15 18:36:09 +08:00
是的 所以使用 localhost 的时候会忽略端口号 不信你试试 改端口看看 都能连上
Joway
2016-11-15 23:59:30 +08:00
靠这种底层细微的优化其实根本无意义, 你优化完了这个, 还有调整内核参数, 调整各种调度算法等等一系列优化呢 , 然而这种东西再怎么优化,上层代码写得差还是全毁了
eyp82
2016-11-16 07:03:31 +08:00
做优化的一个大前提, 是先对性能指标进行测量, 找到最该优化的环节.
在这个场景下, 很多时候性能瓶颈在 I/O, 本机即使走 TCP/IP 协议栈, 以 CPU 的速度, 拆包打包的速度甩 I/O 一万条街不止.
所以, 其实是个伪命题...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/320576

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX