- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个数据库,其中列出了相当不错的服务器(四核至强 2.0Ghz、16GB RAM、SSD 驱动器)。该数据库有大约 180,000 个列表。服务器上还没有流量,我只是用大量列表对其进行测试,以确保以后在实际有那么多实时列表和实际流量时不会出现问题。
但即使还没有流量,我觉得他们应该比实际返回得更快。
从慢查询日志中,我能够找到这个:
# Query_time: 1.575742 Lock_time: 0.000113 Rows_sent: 12 Rows_examined: 549024
有 180,000 条记录,它只需要返回 12 条记录,但它检查了超过 500,000 条记录并且需要超过 1.5 秒?一定是出了什么问题,对吧? :(
实际查询是:
SELECT a.listing_id, a.name, a.item_price, a.max, a.nb, a.currency,
a.end_time, a.closed, a.bold, a.hl, a.buy_price, a.is_offer, a.reserve,
a.owner_id, a.postage_amount, a.fb_current_bid, a.type, a.start_time,
a.is_relisted_item, a.enable
FROM db_listings a
LEFT JOIN db_users u ON u.user_id=a.owner_id WHERE a.active=1 AND
a.approved=1 AND a.deleted=0 AND a.creation_in_progress=0 AND
a.closed=0 AND (a.list_in='store' OR u.shop_active='1')
GROUP BY a.listing_id
ORDER BY a.list_in ASC, a.end_time ASC LIMIT 0, 12;
索引已经设置在 db_listings 中的 listing_id 以及 db_users 中的 user_id 上。我认为 db_users 加入不是问题,因为现在那里只有 2 个用户。
如果您需要任何其他信息来解决这个问题,请告诉我。
非常感谢任何帮助:)
最佳答案
首先,您的查询有问题。您使用 LEFT JOIN,但是您使用 where 子句变成了隐式 INNER JOIN: AND (a.list_in='store' 或 u.shop_active='1')
为什么这会将 LEFT JOIN 变成隐式的 INNER?因为当没有匹配的用户时,LEFT JOIN 将为 u.shop_active 生成 NULL 值,但 NULL 永远不会等于“1”。这会将查询转换为 INNER JOIN,因为 OUTER JOIN 生成的任何行都将由 WHERE 条件过滤。
这个过滤器也是性能问题的原因。您在两个不同表中的列之间有 OR 条件。没有索引可以满足这样的条件。
这是另一种可能表现更好的方式。此版本将仅搜索列表 where (a.list_in != 'store' and u.shop_active = '1') 当列表少于 12 list_in='store' 时。
要使用以下内容,请确保您在 (list_in, end_time) 上有一个索引
SELECT * FROM
(
SELECT a.listing_id, a.name, a.item_price, a.max, a.nb, a.currency,
a.end_time, a.closed, a.bold, a.hl, a.buy_price, a.is_offer, a.reserve,
a.owner_id, a.postage_amount, a.fb_current_bid, a.type, a.start_time,
a.is_relisted_item, a.enable
FROM db_listings a
WHERE list_in = 'store'
a.active=1 AND
a.approved=1 AND
a.deleted=0 AND
a.creation_in_progress=0 AND
a.closed=0
ORDER BY end_time
LIMIT 12
)
UNION ALL
(
SELECT a.listing_id, a.name, a.item_price, a.max, a.nb, a.currency,
a.end_time, a.closed, a.bold, a.hl, a.buy_price, a.is_offer, a.reserve,
a.owner_id, a.postage_amount, a.fb_current_bid, a.type, a.start_time,
a.is_relisted_item, a.enable
FROM db_listings a
JOIN users u
ON a.owner_id = u.user_id
AND u.shop_active = '1'
WHERE list_in != 'store' AND
a.active=1 AND
a.approved=1 AND
a.deleted=0 AND
a.creation_in_progress=0 AND
a.closed=0
ORDER BY end_time
LIMIT 12
)
) sq
ORDER BY list_in, end_time
LIMIT 12;
关于mysql - Rows_sent : 12 Rows_examined: 549024 - how to optimize mySQL query?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11812785/
我有一个查询,根据我的慢查询日志,它有点慢...... Query_time: 8.408943 Lock_time: 0.000119 Rows_sent: 1 Rows_examined: 2
我在 mysql_slow_queries 日志中有一个查询,如下所示: 查询时间:4.642323 锁定时间:1.821996 已发送行数:14 已检查行数:27099 SET TIMESTAMP=
我有一个 MySQL 慢查询日志,显示相同的查询在几分钟内运行了两次。在此期间,表中没有添加任何内容,任何记录的关键字段也没有更改。为什么检查的行数会不同? # Time: 130615 11:35:
我正在为自己开发的应用构建一些配置文件信息。我希望调试页面显示发送的查询以及检查了多少行,而不假设 slow_log 已打开,更不用说解析它了。 回到 2006 年,我想要的是 not possibl
来自 mysql-slow-log 的日志: 查询时间:11.632750 锁定时间:1.317329 已发送行数:851 已检查行数:1649439 select record.name, dept
我正在尝试简单地“合并”12 个表的所有行。所有表加起来有 115 行。但是,如果我运行下面的查询,则在使用“explain”时会得到以下内容,并且在设置为“log-queries-not-using
当重构我的 entries 表并将 source 列拉入一个单独的 sources 表时,我正在执行更新,您可以看到在下面的 slow_query_log 中。 entries 表有 2 到 300
我有一个数据库,其中列出了相当不错的服务器(四核至强 2.0Ghz、16GB RAM、SSD 驱动器)。该数据库有大约 180,000 个列表。服务器上还没有流量,我只是用大量列表对其进行测试,以确保
我是一名优秀的程序员,十分优秀!