V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  h0099  ›  全部回复第 5 页 / 共 9 页
回复总数  166
1  2  3  4  5  6  7  8  9  
2023-01-15 23:06:14 +08:00
回复了 byaiu 创建的主题 程序员 tiff 格式导入 pg,提供查询接口。有偿咨询。
2023-01-15 23:02:25 +08:00
回复了 yingqiuQAQ 创建的主题 程序员 MySQL5.7 连接数 在线调整异常?
> An error occurred

什么 error 呢?您能否找出更具体的错误信息?
mysqld 负荷压力大不大?是不是一大堆 sql 卡着一直在执行?看看 SHOW PROCESSLIST
看看 SHOW ENGINE INNODB STATUS\G ?还有 mysql 本身的 errorlog
2023-01-15 22:58:53 +08:00
回复了 edis0n0 创建的主题 Linux 为什么硬盘卡 IO 会导致 CPU usage (wa)升高?这两者有什么关系?
wa=waiting for i/o ,又称 iowait
wa%的统计口径是一切 hardware interrupt 造成的 cputime ,他本身被归类到 idle%中

https://serverfault.com/questions/12679/can-anyone-explain-precisely-what-iowait-is 进一步指出
> IOWait (通常标注%wa 在 top )是 idle 的一个子类(%idle 通常表示为除了定义的子类之外的所有 idle ),意思是 CPU 没有做任何事情。因此,只要 CPU 可以处理另一个进程,它就会处理。此外,idle 、user 、system 、iowait 等都是针对 CPU 的度量。换句话说,你可以把 iowait 看作是等待 io 导致的空闲。
> 准确地说,iowait 是接收和处理硬件中断所花费的时间占处理器滴答的百分比。软件中断通常单独标记为%si.
> 但是没有 iowait 并不一定意味着您的应用程序在 IO 上没有瓶颈。考虑在一个系统上运行的两个应用程序。如果程序 1 是严重的 io 瓶颈,而程序 2 是重度 CPU 用户,则%user + %systemCPU 可能仍约为 ~100%,相应地,iowait 将显示 0 。但这只是因为程序 2 是密集型的,相对而言似乎什么也没说程序 1 ,因为所有这些都是从 CPU 的角度来看的。

> 假设有两个程序在一个 CPU 上运行。一个是从磁盘读取的“dd”程序。另一个是不执行 I/O 但将 100% 的时间用于计算工作的程序。现在假设 I/O 子系统有问题,并且物理 I/O 需要一秒钟才能完成。每当“dd”程序在等待其 I/O 完成时处于休眠状态,另一个程序就可以在该 CPU 上运行。当时钟中断发生时,总会有程序运行在用户态或系统态。因此,%idle 和 %iowait 的值将为 0 。即使 iowait 现在为 0 ,这并不意味着没有 I/O 问题,因为如果物理 I/O 需要一秒钟才能完成,则显然存在问题。

https://serverfault.com/questions/684339/why-cpu-spent-time-on-iowa
> CPU 空闲状态分为两种不同的“子”状态:iowait 和 idle 。
> 如果 CPU 空闲,则内核然后确定是否有至少一个当前正在进行的 I/O 到本地磁盘或从该 CPU 启动的远程安装磁盘 (NFS)。如果存在,则 CPU 处于状态 iowait 。如果没有从该 CPU 启动的正在进行的 I/O ,则 CPU 处于 idle 状态。
> 因此,iowait 是 CPU 空闲时间的百分比,并且至少有一个 I/O 正在从该 CPU 启动。
> iowait 计数器表明系统可以处理更多的计算工作。仅仅因为 CPU 处于 iowait 状态并不意味着它不能在该 CPU 上运行其他线程或进程。
> 所以,iowait 这只是一种空闲时间。

(假设是 Linux ,虽然一般概念可以应用于其他操作系统。)

https://serverfault.com/questions/972343/what-is-the-relation-between-io-wait-utilisation-and-load-average
> 工作负载不能仅通过平均负载和 %iowait 来描述。这些指标仅汇总特定状态下的任务。分别计算可运行和不可中断、空闲时间和未完成的 I/O 。
> 您可能会遇到这样一种情况,即有任务处于可运行状态,有一些空闲 CPU 周期,但 I/O 上没有空闲。想象一个有点繁忙的 Web 服务器,有 200 个工作进程在 2 个 CPU 上运行。平均负载约为 1 ,iowait 接近 0 。任务很多,每个任务的工作量都不是很多,CPU 闲置但在磁盘上等待的时间更少。

如果这个假设的 Web 服务器 VM 被实时迁移,它的内存延迟和可用的 CPU 时间可能会受到短暂的影响。一个症状是更高的平均负载,但这不会驱动 iowait 。
2023-01-15 22:50:03 +08:00
回复了 shade 创建的主题 程序员 关系数据库存储属性变量可变的 Java 对象,怎么优化 sql
2023-01-15 22:48:41 +08:00
回复了 shade 创建的主题 程序员 关系数据库存储属性变量可变的 Java 对象,怎么优化 sql
https://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model
典型例子是 wordpress 中臭名昭著的 wp_postmeta 表 https://codex.wordpress.org/Database_Description

但 EVA 性能也不如文档数据库(如 mongo )好,除非按 meta_key 分 partition 甚至分表
2023-01-15 22:08:20 +08:00
回复了 shendaowu 创建的主题 MySQL 如何防止大量耗时的数据库查询影响网页加载速度?
> 重启 MariaDB 之后

每次 mysqld 重启都会完全清空内存中的 innodb buffer pool ,而您再次在重启后的 mysqld 上首次查询这 sql 就需要从硬盘读大量 innodb page 进 buffer pool ,所以这时吃内存和硬盘 io 拖慢了 sql 耗时

> 重启之后对那条带 IN 的语句改来改去一阵之后又 10 毫秒左右

实际上您啥也不改单纯的在等到这查询所需的 page 都进了 buffer pool 之后再怎么反复执行耗时都是差不多的(除非您的 buffer pool 太小或是其他无关 sql 又进来导致 page 被反复逐出 pool 又从硬盘读取进 pool )

> 我发现的异常。刚插入随机的测试数据之后 explain 那条带 IN 的语句 key 是 tag_content_rel_index ,key_len 是 4 ,rows 是一万左右。重启之后 key 是 content_index 。强制用 tag_content_rel_index 之后 key_len 是 8 ,rows 是 1

因为您创建表并狂暴轰入大量垃圾数据后没 ANALYZE TABLE 和 /或 OPTIMIZE TABLE 所以查询计划优化器还以为这表里头没有几行所以就选择了可能更慢的计划 stackoverflow.com/questions/586381/mysql-not-using-indexes-with-where-in-clause
还要看 filtered 是多少

> 另外 10 毫秒左右的是不是就没法优化了?

一条 sql 耗时 10ms 还需要优化?
如果这 sql 返回的行很多那实际上查询结果从 mysqld 到您的业务程序的 dbdriver ,再从 dbdriver 进入您的业务代码被您写的奇妙深刻业务逻辑消费的时间都远超 10ms 了(如果 mysqld 跟您的业务程序不在同一 localhost 而是走网络那延迟更高,那些选择无脑上云的业务环境里就是这样)
还不论从您的业务程序最终输出 html/json/xml 后走网络到最终用户那又要多久
2023-01-15 21:59:58 +08:00
回复了 shendaowu 创建的主题 MySQL mysql 或者 mariadb 能不能限制某条语句的资源消耗?
> 在我的电脑上那条带 IN 的语句的执行时间很不稳定,有时候 10 毫秒左右,有时候一两秒,有时候一二十秒。这么不稳定的执行时间我接受不了了。之前说不纠结这个一部分就是因为很多次都是 10 毫秒左右,现在这么不稳定不能不纠结了。我新问了一个问题: https://www.v2ex.com/t/909074 。忙的话就不用看了。

您后台是不是跑着一堆频繁内存 /硬盘 io 的程序?您应该先把他们都关掉以控制变量,或是直接去开个空白服务器专门测试这些
您 innodbbufferpoolsize 多少?是不是还用着默认的 128M ?
2023-01-15 21:56:43 +08:00
回复了 shendaowu 创建的主题 MySQL mysql 或者 mariadb 能不能限制某条语句的资源消耗?
> https://blog.csdn.net/kevinxxw/article/details/109567275
> in 通常是走索引的,当 in 后面的数据在数据表中超过 30%(上面的例子的匹配数据大约 6000/16000 = 37.5%)的匹配时,会走全表扫描,即不走索引,因此 in 走不走索引和后面的数据有关系。

这不就是 cost-based optimizer 认为直接 full table scan 的 IO 时间开销比去使用索引然后反复在 primary/secondary index 和具体的 datanode 之间绕圈子更快?这跟 where in 有关系吗?
您自己建个只有 10 行的表,哪怕您给`WHERE field=1`的 field 加了索引 EXPLAIN 也会显示根本不使用您加的索引因为 scan10 行远比去索引里绕要快
so 人早已道明真相: https://stackoverflow.com/questions/586381/mysql-not-using-indexes-with-where-in-clause

另外阁下看着这些简中互联网的 csdn 垃圾还不如去啃 en 文档或 en 书籍:
https://dev.mysql.com/doc/refman/8.0/en/mysql-indexes.html
https://use-the-index-luke.com/sql/where-clause/searching-for-ranges/greater-less-between-tuning-sql-access-filter-predicates


> 估计属于可得性偏差了。大意是认为容易想到的东西出现的概率更大。我平时经常用知乎,stackoverflow 好像是没用过,虽然经常能搜到上面的问题。因为经常用知乎,所以以为知乎的那套规矩是比较常见的。其实我之前也想过那可能只是为了赚钱和增长之类的原因才那么定的,不过应该是可得性偏差的力量太强大了。

逼乎那群功利主义者带 v KOL 您指望什么?整天吹嘘着知识付费然后反手把几年前发的回答给删了放进盐选订阅里
等您花了几块钱巨款打开一看全都是车轱辘话和十几年前 web2.0 时代的互联网上唾手可得的信息的复制粘贴嗯缝合,或是像 csdn 人那样去机翻 en 互联网上的公开免费信息回来兜售二手屎
stackexchange 人至少不搞什么乱七八糟的 monetize ,您把您的 sql pastebin 发到 dba.stackexchange 上同样会有人指出您的`WHERE tag_id`无法直接使用索引而只能`using index for skip scan`,所以应该按照最左字段原则改变 composite key 中的字段顺序

> 你的意思是你很忙吗?是的话那抱歉消耗你时间了。

我只是说我们都在与 mysql 搏斗
2023-01-15 21:37:13 +08:00
回复了 pppguest3962 创建的主题 MySQL 这种宕机的修表,怎么做能挽回数据?
REPAIR TABLE 是用于以前使用 myisam 引擎的表的,您的 sStatus 的 table engine 是 innodb 还是 myisam ?(还有人用 myisam ?)
2023-01-15 00:03:59 +08:00
回复了 shendaowu 创建的主题 MySQL mysql 或者 mariadb 能不能限制某条语句的资源消耗?
与此同时:我还在与表结构 migration 搏斗
https://i.imgur.com/dWpNcH2.png
2023-01-14 22:31:16 +08:00
回复了 shendaowu 创建的主题 MySQL mysql 或者 mariadb 能不能限制某条语句的资源消耗?
2023-01-14 22:30:28 +08:00
回复了 shendaowu 创建的主题 MySQL mysql 或者 mariadb 能不能限制某条语句的资源消耗?
`解决个人问题`建议立即前往 stackexchange 站群的各个站点如 stackoverflow ,他们可不会计较什么`这是您自己的复杂问题关我啥事`,因为这种 answer 发出来就会被 tag off-topic 一瞬削除
2023-01-14 22:28:33 +08:00
回复了 shendaowu 创建的主题 MySQL mysql 或者 mariadb 能不能限制某条语句的资源消耗?
> 比如那个 in 据说在某些情况下会出问题

啥问题?

> 我想优化的其实是那个带 in 的查询语句

#19 显示`WHERE content_id = 50000`比那一坨`WHERE tag_id IN`要慢,因为 content_id 只能`skip scan with index`
而且 tag_id 应该是走 PK 上的索引了的因为您的 PK 是(tag_id, content_id)符合最左字段
所以阁下要优化这几百 ms 的 sql ?

> 今天我又试了一下结果 HeidiSQL 又偶尔出现不到一毫秒的情况了,这次没看错。不过我猜应该是 HeidiSQL 的显示不准确

建议 phpmyadmin/datagrip

> 你愿意提供收费优化 SQL 的服务吗?感觉有点主动上钩的感觉,如果你真是有意的的话。抱歉我带着恶意揣测你了
v2 人发帖回答您时收您费了?顶多您回帖需要站内积分

> 表结构之类的东西: https://pastebin.com/Kin9UkXg 。太长了,直接发我嫌浪费积分

然而您有着 14k 积分

> 知乎禁止过于个人化的问题,想要解决个人问题基本上只能用付费咨询。

什么知乎盐选
所以这里是知乎还是 V2EX ?还是说 V2EX 早已被知乎收购?建议立即致电 livid
2023-01-13 20:45:50 +08:00
回复了 anonymous2351d00 创建的主题 Vue.js Q: Vue 有没有什么可以在无需引用就可挂载的全局对象?
2023-01-13 20:44:47 +08:00
回复了 wuwukai007 创建的主题 Python 今天刚发现 Python 简单的递归用 reduce 实现感觉蛮简洁的
#3 @zhy0216 可以吧
https://pythonsimplified.com/everything-you-need-to-know-about-python-lambda-functions/
> Another way you can invoke the Lambda function is through Immediately Invoked Function Expression (IIFE). However, this is not a recommended use of calling lambda expression. You don’t see this method being used anywhere. I have mentioned this for informational purposes only.
> >>> print((lambda x: x**2)(5))
> 25

https://elfi-y.medium.com/python-lambda-%CE%BB-6c62a5427913
> We can invoke them directly in Immediately Invoked Function Expressions (IIFE) like:
> (function (a, b) {return a + b })(1, 2); // 3
> ((a,b) => (a+b))(1, 2); // 3
2023-01-13 20:39:14 +08:00
回复了 shendaowu 创建的主题 MySQL mysql 或者 mariadb 能不能限制某条语句的资源消耗?
而 uniq 表比原表小的多,这就是因为不再需要那个 `隐式的自增 id 字段作为主键`
https://i.imgur.com/rynDF0i.png
https://i.imgur.com/YEuKO58.png

回到`SELECT * FROM tag_content_rel WHERE content_id = 50000`本身,他的 EXPLAIN 是
https://i.imgur.com/xVVVitb.png

Using index for skip scan 意味着查询计划是将 key (这里是 PK )用于帮助加快 full table scan 的速度,因为根据 key 中的信息可以知道有些行可以直接跳过(所以叫 skip scan ),但这并不能改变查询计划仍然是在做 full table scan 的罪恶本质: https://dev.mysql.com/doc/refman/8.0/en/range-optimization.html
而只能 full table scan 的根本原因是这个 sql 的 where 子句只有对字段 content_id 的约束,而 content_id 不在任何索引的最左字段(第一个)之中,因为您的 PK 是(tag_id, content_id)而不是(content_id, tag_id)

所以在
ALTER TABLE `tag_content_rel_uniq` ADD INDEX(`content_id`)
之后
https://i.imgur.com/fETf9OI.png
立省 50%
EXPLAIN 显示这下的确是直接使用了新建的 content_id 索引,所以不再需要任何形式的 full table scan 了:
https://i.imgur.com/vyauhY0.png

但代价是这个新索引吃了 148mb 空间(加了之后我还没 OPTIMIZE TABLE ),但整个表大小 460 也小于您最初设计的表 604
https://i.imgur.com/sLzqfgp.png
如果您需要节省空间(既是指硬盘上的空间也是指 innodb buffer pool 中能塞下多少个这样大的表的 index )
那么需要根据您实际业务的查询,您是主要查询 WHERE content_id 还是 WHERE tag_id (都只约束一个字段,如果两个字段都约束那肯定会用上 composite key ,因为您的 CK 只有这两个字段),就把哪个字段移动到现有 CK (在这里是 PK )的最左(第一个)
2023-01-13 20:24:43 +08:00
回复了 shendaowu 创建的主题 MySQL mysql 或者 mariadb 能不能限制某条语句的资源消耗?
```sql
ALTER TABLE `tag_test`.`tag_content_rel` DROP INDEX `tag_content_rel_index`, ADD PRIMARY KEY (`tag_id`, `content_id`) USING BTREE
```
#1062 - Duplicate entry '87582-57377' for key 'tag_content_rel.PRIMARY'

真就 `需求就是允许一个 content 有着多个完全重复的 tag` 呗(当然我知道有重复的`tag_id,content_id`对是因为您的存储结构是直接生成随机数值来 INSERT 的而又没有去重)

```sql
CREATE TABLE IF NOT EXISTS tag_content_rel_uniq
(
tag_id INT NOT NULL,
content_id INT NOT NULL,
PRIMARY KEY (tag_id, content_id)
);
INSERT IGNORE INTO tag_content_rel_uniq(tag_id, content_id) SELECT * FROM tag_content_rel;
OPTIMIZE TABLE tag_content_rel_uniq;
SELECT COUNT(*) FROM tag_content_rel_uniq;
SELECT * FROM tag_content_rel_uniq WHERE content_id = 50000;
```
耗时还是差不多
2023-01-13 20:11:28 +08:00
回复了 shendaowu 创建的主题 MySQL mysql 或者 mariadb 能不能限制某条语句的资源消耗?
```sql
CREATE TABLE tag_content_rel(
tag_id INT NOT NULL,
content_id INT NOT NULL);

CREATE INDEX tag_content_rel_index ON tag_content_rel(tag_id, content_id);
```

您为什么不用自带 unique 约束的 primary key ?还是说您的需求就是允许一个 content 有着多个完全重复的 tag ?
您设置为普通 index 就意味着他是 secondary index ,而这个表无 PK 也无 UK 就意味着 innodb 只能自动生成一个隐式的自增 id 字段作为主键,这被关系代数学家称作 https://en.wikipedia.org/wiki/Surrogate_key: https://dev.mysql.com/doc/refman/8.0/en/innodb-index-types.html
> If a table has no PRIMARY KEY or suitable UNIQUE index, InnoDB generates a hidden clustered index named GEN_CLUST_INDEX on a synthetic column that contains row ID values. The rows are ordered by the row ID that InnoDB assigns. The row ID is a 6-byte field that increases monotonically as new rows are inserted. Thus, the rows ordered by the row ID are physically in order of insertion.

> 可能是 MySQL 或者 SSD 的缓存的问题
考虑到您都不知道`innodb_buffer_pool_size` https://dev.mysql.com/doc/refman/8.0/en/innodb-buffer-pool.html:
建议深入学习贯彻 RDBMS 供应商无关的关系代数理论知识: https://use-the-index-luke.com 然后再结合 innodb 本身的实现进行思考
1  2  3  4  5  6  7  8  9  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5254 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 24ms · UTC 09:31 · PVG 17:31 · LAX 01:31 · JFK 04:31
Developed with CodeLauncher
♥ Do have faith in what you're doing.