- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我们网站上的特定 UPDATE 查询有时会运行得非常慢,并且会检查比必要的多得多的行。它按主键过滤,所以我希望 MySQL 总是只需要检查一行。
以下是 MySQL 的慢查询日志中的一些示例:
# Time: 090702 12:59:06
# User@Host: XXX[XXX] @ XXX [XXX]
# Query_time: 21 Lock_time: 0 Rows_sent: 0 Rows_examined: 500500
SET timestamp=1246532346;
UPDATE `folders` SET `folder_id` = '1705641', `updated_at` = now() WHERE `folders`.`id` = '1682995';
# Time: 090702 14:13:44
# User@Host: XXX[XXX] @ XXX [XXX]
# Query_time: 17 Lock_time: 0 Rows_sent: 0 Rows_examined: 16816745
SET timestamp=1246536824;
UPDATE `folders` SET `folder_id` = '417997', `updated_at` = now() WHERE `folders`.`id` = '1705956';
# Time: 090702 14:15:42
# User@Host: XXX[XXX] @ XXX [XXX]
# Query_time: 13 Lock_time: 0 Rows_sent: 0 Rows_examined: 16816719
SET timestamp=1246536942;
UPDATE `folders` SET `folder_id` = '1706267', `updated_at` = now() WHERE `folders`.`id` = '1705956';
# Time: 090702 16:07:43
# User@Host: XXX[XXX] @ XXX [XXX]
# Query_time: 499 Lock_time: 0 Rows_sent: 0 Rows_examined: 88668449
SET timestamp=1246543663;
UPDATE `folders` SET `folder_id` = '1707407', `updated_at` = now() WHERE `folders`.`id` = '1706992';
不过,查询的运行频率更高,因此它并不总是会暴露此行为。此外,如果我手动运行相同的查询,它们运行良好并立即返回。
我也验证了表格,据我所知应该没问题:
mysql> describe folders;
+------------------+-----------------------+------+-----+---------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------------+-----------------------+------+-----+---------------------+----------------+
| id | mediumint(8) unsigned | NO | PRI | NULL | auto_increment |
| user_id | mediumint(8) unsigned | NO | MUL | NULL | |
| folder_id | mediumint(8) unsigned | YES | MUL | NULL | |
| created_at | timestamp | NO | | CURRENT_TIMESTAMP | |
| updated_at | timestamp | NO | | 0000-00-00 00:00:00 | |
| modified_at | timestamp | NO | | 0000-00-00 00:00:00 | |
| name | varchar(255) | NO | | NULL | |
| guest_permission | tinyint(3) unsigned | NO | | 1 | |
+------------------+-----------------------+------+-----+---------------------+----------------+
8 rows in set (0.00 sec)
mysql> show index from folders;
+---------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+---------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| folders | 0 | PRIMARY | 1 | id | A | 760318 | NULL | NULL | | BTREE | |
| folders | 1 | user_id | 1 | user_id | A | 69119 | NULL | NULL | | BTREE | |
| folders | 1 | folder_id | 1 | folder_id | A | 380159 | NULL | NULL | YES | BTREE | |
+---------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
3 rows in set (0.00 sec)
另一件事是 MySQL 服务器有时会锁定并停止接受连接,每次发生这种情况时,我通常会在失败前立即在日志文件中找到这些慢速查询之一。我在其他日志文件中看不到任何相关的错误消息,但 MySQL 重新启动使其再次响应。
有没有人知道发生了什么,或者我可以检查哪些内容来缩小问题范围?
编辑:我们在专用服务器上使用 MySQL 5.0.51a,目前有 6 个网络服务器运行 PHP 5.2.6 并通过 PDO 连接到 MySQL 服务器。所有服务器都运行 Debian Lenny。慢查询发生在所有网络服务器上。
编辑:这是相关查询的解释,带引号和不带引号:
mysql> explain SELECT * FROM `folders` WHERE `folders`.`id` = '1682995';
+----+-------------+---------+-------+---------------+---------+---------+-------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------+-------+---------------+---------+---------+-------+------+-------+
| 1 | SIMPLE | folders | const | PRIMARY | PRIMARY | 3 | const | 1 | |
+----+-------------+---------+-------+---------------+---------+---------+-------+------+-------+
1 row in set (0.00 sec)
mysql> explain SELECT * FROM `folders` WHERE `folders`.`id` = 1682995;
+----+-------------+---------+-------+---------------+---------+---------+-------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------+-------+---------------+---------+---------+-------+------+-------+
| 1 | SIMPLE | folders | const | PRIMARY | PRIMARY | 3 | const | 1 | |
+----+-------------+---------+-------+---------------+---------+---------+-------+------+-------+
1 row in set (0.00 sec)
最佳答案
这很奇怪,但我猜可能是因为您的 id 字段是 int 但您传递的是字符串(带引号)。尝试不使用字符串,看看是否有帮助。
为了帮助弄清楚到底发生了什么,将查询更改为具有相同 WHERE 子句的 SELECT 并通过 EXPLAIN 运行它。像这样:
EXPLAIN SELECT * FROM `folders` WHERE `folders`.`id` = '1682995';
EXPLAIN SELECT * FROM `folders` WHERE `folders`.`id` = 1682995;
看看有没有区别。
关于通过主键进行的 MySQL UPDATE 查询有时非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1074801/
命令 npm update 有什么区别和包裹npm-check-updates ?使用后者是否完全安全? 执行后好像是npm update并非所有软件包都已更新,因此似乎不完整。许多其他 popula
我有使用 ExpressJS 和 ORM Sequelize 的 API。我正在尝试使用 Sequelize 中的 update() 方法进行更新。默认情况下,it 方法将返回更新的行数。但我希望结果
关于如何更新 rubygems 有点困惑。过程不断变化(或者至少我从互联网上得到了相互矛盾的信息)。 $ gem outdated rubygems-update (1.8.10 < 1.8.11
我正在使用 webpack-dev-server处于开发模式( watch )。每次服务器重新加载时,一些 json 和 js 文件都会挤满我的构建目录,如下所示:'hash'.hot-update.
Mamp Pro 的当前版本是 5.04 (15996)。可用更新窗口显示“Mamp 5.0.0 > 5.1。更新失败,并显示一条消息:错误:无法验证更新。请确保您使用的是安全网络,然后重试。” 更新
我想在浏览量增加时更新时间戳“lastpageview_at”。我想我已经接近了,但我总是遇到语法错误,有人知道为什么或有其他解决方案吗? 我的触发器: CREATE TRIGGER Update_l
我正在执行 SELECT ... FOR UPDATE 以锁定一条记录,然后进行一些计算,然后进行实际的 UPDATE。我正在处理 InnoDB 数据库。 但是计算可能会以我不想执行 UPDATE 的
我需要在表更新时进行一些更新和插入以强制执行正确的数据。将 UPDATE 语句放入触发器中会导致某种“循环”吗? 谢谢! 最佳答案 更新触发器中的目标表将使触发器再次触发。 您可以使用 TRIGGER
这是我的布局 当我点击链接更新时,该链接应该打开和关闭renderComment bool
我有一个包含两件事的 Angular 范围: 一个包含 10k 行的巨型表格,需要一秒钟才能渲染 一些小的额外信息位于固定的覆盖标题栏中 根据您向下滚动页面/表格的距离,我必须更新标题中的小信息位之一
标题几乎已经说明了一切。 IF NEW.variance <> 0 THEN (kill update) END IF 这可能吗? 最佳答案 查看手册 (http://dev.mysql.com/do
我有几个表,我想强制执行版本控制,并且有一个生效日期和生效日期。每当应用程序或用户向该表写入更新时,我希望它重定向到两个全新的命令:更新目标记录,以便 EFFECTIVE_TO 日期填充当前日期和时间
我正在使用 Shopware,一件奇怪的事情让我抓狂 :( 所以我将首先解释问题是什么。 除了普通商品外,还有多种款式的商品,例如不同尺码的衬衫。这是 XS、S、M、L 和/或不同颜色的同一商品……但
寻求帮助制作 mysql 触发器。我当前的代码无法按预期工作。我想做的是,如果表A中的字段A被修改,则将字段A复制到表A中的字段B。 当前代码如下所示: BEGIN IF new.set_id=301
以下查询(来自此处Postgres SQL SELECT and UPDATE behaving differently) update fromemailaddress set call =
我想使用 D3 使用以下数据创建一个列表: var dataSet = [ { label: 'a', value: 10}, { label: 'b', value: 20},
哪个更好,先进行选择,然后进行更新。或者更确切地说,像这样合而为一: UPDATE items set status = 'NEW' where itemid in (1,2,3,
对于 eloquent model events,updating 和 updated 之间有什么区别? ? 我的猜测是 updating 在模型更新之前触发,而 updated 在模型更新之后触发。
我有一个对象数组(我们称之为arr)。在我的组件输入之一的 (change) 方法中,我修改了这些对象的属性之一,但在 View (*ngFor) 中没有任何变化。我读到 Angular2 变化检测不
我正在尝试使用 d3.js 构建水平日历时间线。主要目标是突出显示用户的假期和假期。 http://jsbin.com/ceperavu/2/edit?css,js,output 我首先从“开始”日期
我是一名优秀的程序员,十分优秀!