gpt4 book ai didi

sql - 在 MySQL 中,如果 foo 被索引,放置 SELECT foo 会提高性能吗?

转载 作者:可可西里 更新时间:2023-11-01 07:42:54 24 4
gpt4 key购买 nike

在 MySQL 中,如果 foo 被索引,放置 SELECT foo 是否会提高性能?

RedditMirror.cc ,我有一个数据库,在 GrabbedSites 表中有 120 万条记录,这个数字每天增加大约 500-2000 条。

在我职业生涯的早期,我被告知唯一应该被索引的列是您

  1. 将来会在 WHERE 或 JOIN SELECT/UPDATE 上执行,
  2. 需要它们是唯一的数据。

正因为如此,GrabbedSites 只索引了一个键(除主键外):categoryID,但查询了 8 列。

该网站接收到大量的闪存流量,有时每天有超过 100,000 名独立访问者,并且数据库在大约 20% 的使用率时变得“不堪重负”。

所以我想知道,在 MySQL 中向所有 8 个经常查询的列添加索引是否会有性能优势?


编辑:查询是:

  SELECT url, 
title,
published,
reddit_key,
UNIX_TIMESTAMP(last_fetched) last_fetched,
comment_link
FROM GrabbedSites
WHERE published BETWEEN DATE_SUB('2010-09-03', INTERVAL 1 DAY)
AND '2010-09-03'
ORDER BY published;

只有索引是“发布”的。

解释说:使用哪里;使用文件排序

最佳答案

首先要注意的是,MySQL 只对每个伪 SELECT(不是语句)使用一个索引——当您使用 EXPLAIN 查看 SELECT 的输出时,您会看到每个选择了哪个索引。 EXPLAIN 只能在 SELECTS 上运行,所以我们必须假设当您换掉 SELECT 的语法时,DELETE/UPDATE 使用相同的计划...

据我所知,大多数数据库(嵌入式数据库可能很奇怪)都支持在以下子句中使用索引:

  • 选择
  • 加入(ANSI-92 语法)
  • WHERE(因为这里有 ANSI-89 过滤)
  • HAVING(相当于 WHERE,但不同于 WHERE - 允许聚合使用而无需子查询)
  • 订购方式

我不是 100% 使用 GROUP BY,所以我暂时忽略它。

最终,优化器会根据其算法和手头的统计数据来选择使用什么。您可以使用 ANALYZE TABLE syntax刷新统计数据(请定期,不要经常)。

附录

MySQL 还限制了用于分配索引的空间量 - 1,000 bytes for MyISAM tables, and 767 bytes for InnoDB tables .由于 MySQL 每个伪 SELECT 仅使用一个索引,覆盖索引(包含多个列的索引)是一个好主意,但它实际上涉及到测试最常见的查询并尽可能地对其进行优化。索引优先级应该是:

  1. 主键(在 v5 的某个地方,为 pk 创建索引变得自动)
  2. 外键(下一个最有可能的 JOIN 候选者
  3. 过滤条件(假设您有空间)

关于sql - 在 MySQL 中,如果 foo 被索引,放置 SELECT foo 会提高性能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3640699/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com