MySQL 索引 - 根据此表和查询,最佳实践是什么

2024-03-18

我有这张表(500,000 行)

CREATE TABLE IF NOT EXISTS `listings` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `type` tinyint(1) NOT NULL DEFAULT '1',
  `hash` char(32) NOT NULL,
  `source_id` int(10) unsigned NOT NULL,
  `link` varchar(255) NOT NULL,
  `short_link` varchar(255) NOT NULL,
  `cat_id` mediumint(5) NOT NULL,
  `title` mediumtext NOT NULL,
  `description` mediumtext,
  `content` mediumtext,
  `images` mediumtext,
  `videos` mediumtext,
  `views` int(10) unsigned NOT NULL,
  `comments` int(11) DEFAULT '0',
  `comments_update` int(11) NOT NULL DEFAULT '0',
  `editor_id` int(11) NOT NULL DEFAULT '0',
  `auther_name` varchar(255) DEFAULT NULL,
  `createdby_id` int(10) NOT NULL,
  `createdon` int(20) NOT NULL,
  `editedby_id` int(10) NOT NULL,
  `editedon` int(20) NOT NULL,
  `deleted` tinyint(1) NOT NULL,
  `deletedon` int(20) NOT NULL,
  `deletedby_id` int(10) NOT NULL,
  `deletedfor` varchar(255) NOT NULL,
  `published` tinyint(1) NOT NULL DEFAULT '1',
  `publishedon` int(11) unsigned NOT NULL,
  `publishedby_id` int(10) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `hash` (`hash`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

我想通过以下方式进行每个查询publishedon between x and y(所有网站只显示1个月的记录)

同时,我想添加publishedon在 where 子句中published, cat_id , source_id

像这样的东西:

SELECT * FROM listings 
WHERE (publishedon BETWEEN 1441105258 AND 1443614458) 
  AND (published = 1) 
  AND (cat_id in(1,2,3,4,5)) 
  AND (source_id  in(1,2,3,4,5))

到目前为止,该查询在没有索引的情况下还可以并且很快,但是当尝试使用时order by publishedon它变得太慢了,所以我使用了这个索引

CREATE INDEX `listings_pcs` ON listings(
    `publishedon` DESC,
    `published` ,
    `cat_id` ,
    `source_id`
)

它起作用了并且order by publishedon变得很快,现在我想要order by views像这样

SELECT * FROM listings 
WHERE (publishedon BETWEEN 1441105258 AND 1443614458) 
  AND (published = 1) 
  AND (cat_id in(1,2,3,4,5)) 
  AND (source_id  in(1,2,3,4,5)) 
ORDER BY views DESC

this is the explanation enter image description here this query is too slow because of ORDER BY views DESC

然后我尝试删除旧索引并添加这个

CREATE INDEX `listings_pcs` ON listings(
    `publishedon` DESC,
    `published` ,
    `cat_id` ,
    `source_id`,
    `views` DESC
)

它也太慢了

如果我只使用单个索引呢publishedon? 在 cat_id、source_id、views、publishedon 上使用单一索引怎么样?

如果我发现其他索引方法依赖于任何其他列,我可以在一个月内更改查询依赖项,例如publishedon

在 (cat_id, source_id, publishedon, published)?但在某些情况下我只会使用source_id?

该表的最佳索引架构是什么


这个查询:

SELECT *
FROM listings
WHERE (publishedon BETWEEN 1441105258 AND 1443614458) AND
      (published = 1) AND
      (cat_id in (1,2,3,4,5)) AND
      (source_id in (1,2,3,4,5));

仅使用索引很难优化。最好的索引是以published然后是其他列——尚不清楚它们的顺序应该是什么。原因是因为除了published没有使用=.

因为您的性能问题在于排序,所以这表明正在返回大量行。通常,索引用于满足WHERE索引之前的子句可用于ORDER BY。这使得优化变得困难。

建议。 。 。没有一个那么伟大:

  • 如果您要按月访问数据,那么您可能会考虑按月对数据进行分区。这将使查询没有ORDER BY更快,但无济于事ORDER BY.
  • 之后尝试各种列顺序published在索引中。您可能会找到最具选择性的列。但是,这再次加快了排序前的查询速度。
  • 考虑如何构建查询以在查询中包含更多相等条件WHERE子句或返回较小的数据集。
  • (不太推荐)放置索引published和订购栏。然后使用子查询来获取数据。设不等式条件 (IN等等)在外部查询中。子查询将使用索引进行排序,然后过滤结果。

不推荐最后一个的原因是因为 SQL(和 MySQL)不保证子查询结果的排序。然而,由于 MySQL 实现了子查询,因此结果确实是有序的。我不喜欢使用未记录的副作用,这些副作用可能会因版本而异。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL 索引 - 根据此表和查询,最佳实践是什么 的相关文章

随机推荐

  • 强制 Expression<> 计算局部变量

    我的 LinqPad 中有类似的东西 void Main var t1 DateTimeOffset Parse 10 1 2012 int n1 1 Expression
  • 我如何委托给 Scala 中的成员?

    在 Scala 中是否可以这样写 trait Road class BridgeCauseway extends Road implements method in Road class Bridge extends Road val ro
  • iPad 弹出窗口中的 NavigationView 在 SwiftUI 中无法正常工作

    我有以下代码 当点击按钮时显示弹出窗口 struct ContentView View State private var show false var body some View Button Open self show toggle
  • 无法使用 torch.Tensor 创建张量

    我试图创建一个张量 如下所示 import torch t torch tensor 2 3 我收到以下错误 类型错误回溯 最近调用 最后 在 gt 1 a torch tensor 2 3 类型错误 tensor 需要 1 个位置参数 但
  • 使用 objdump 反汇编平面二进制文件

    我可以使用 objdump 反汇编平面二进制文件吗 我熟悉使用以下方法反汇编结构化二进制可执行文件 例如 ELF 文件 objdump d file elf 但是 如果我有一个我知道应该加载的平面二进制文件 例如地址 0xabcd1000
  • MappingException Edm.String 与 SqlServer.varbinary 不兼容

    我很难解决一个愚蠢的地图问题 基本上发生的事情是我在 sql db 表中有一个字段 该字段是出于安全目的 加密和解密 的 varbinary 所有这些东西都很好 但似乎 edmx 将该表中的字段视为一个字符串 我认为它应该将其视为给定的数据
  • 具有作用域变量的全局 Makefile

    我正在尝试根据需要将整个项目转换为单个 Makefile 如果this http aegis sourceforge net auug97 pdf每当我遇到递归 makefile 问题时 我都会看到我的所有搜索结果都乱七八糟 然而 我遇到了
  • Capistrano 3 等效复制策略

    我更新到了 Cap 3 看来set deploy via copy不再支持 在里面发布公告 http www capistranorb com 2013 06 01 release announcement html有一个指向视频的链接 用
  • R 中 ntile 和 cut 以及 then quantile() 函数之间的区别

    我发现了关于这个主题的两个线程 用于计算 R 中的十分位数 但是 这两种方法 即dplyr ntile and quantile 产生不同的输出 实际上 dplyr ntile 无法输出正确的十分位数 方法 1 使用 ntile From
  • [[17.0.0,17.0.0]] 上的各个其他库正在请求 com.google.firebase:firebase-iid 库,但解析为 16.2.0

    我今天开始收到此错误 昨天一切正常 gradle 或 firebase 版本没有变化 com google firebase firebase iid 正在请求库 17 0 0 17 0 0 处的各种其他库 但解析为 16 2 0 禁用插件
  • 在运行 .NET 4 的 IIS 7 上找不到默认角色提供程序

    大家早上好 我正在尝试在我的 Web 应用程序中实现自定义成员身份和角色提供程序 这些应用程序是在 IIS 7 实例的默认网站下实现的 我的 Web 应用程序在 NET 4 应用程序池下运行 但是 设置相应的web config后 出现以下
  • 使用 C# 组合两个相对路径

    将相对路径附加到绝对路径 有很多欺骗 但我需要添加相对路径 e g Path1 Parent Child a txt Path2 Sibling file cs Result Parent Sibling file cs Tried Dir
  • Java:计算二项式系数

    我有以下程序计算两个整数的二项式系数 但我想更改程序 它只计算并保存解决方案所需的系数 问题是我现在真的不知道该怎么做 The Code https i stack imgur com 6TUDE jpg public static lon
  • jdk10中外部jar包放在哪里

    我一直在 JDK8 中将外部 jar 放入 jre lib ext 中 但是 当我将jdk更新到jdk10时 我在jdk目录中找不到jre子目录 所以我从Oracle下载了jre10 结果发现ext目录丢失了 我应该把这些外部jar放在哪里
  • C++ 和 C 中的命名空间

    并不是说我会ever在我的专业工作中编写如下代码 以下代码在c 和c中是合法的并且编译时没有警告 include
  • UITextField 仅在顶部或底部具有圆角半径

    我有一个UITextField已添加到视图中 我正在尝试更改它的默认外观 我想要的是改变圆角半径 但仅限于顶部 底部 我这样做是这样做的 UIBezierPath usernameMaskPathWithRadiusTop UIBezier
  • 在 LISP 中使用“ash”执行二分查找?

    所以 我现在正在阅读 Land of Lisp 事实证明 Lisp 与我见过的其他编程语言有很大不同 无论如何 本书提供了一些我们要输入到 CLISP REPL 中的代码 defparameter small 1 defparameter
  • 如何解决心跳时间超过“00:00:01”失败的问题?

    我有一个执行 HTTP POST 的 NetCore C 项目 该项目是在 Kubernetes 中设置的 我注意到以下日志 Heartbeat took longer than 00 00 01 at 02 22 2020 15 43 4
  • 无法运行我的程序

    尝试制作我的第一个程序 基本智力游戏 每次我尝试运行它时都没有显示任何内容 并且不知道出了什么问题 希望您能给我一些帮助或建议 顺便说一句 我在 Java 编程方面几乎是菜鸟 所以请轻松地评论 这是代码 import java util i
  • MySQL 索引 - 根据此表和查询,最佳实践是什么

    我有这张表 500 000 行 CREATE TABLE IF NOT EXISTS listings id int 10 unsigned NOT NULL AUTO INCREMENT type tinyint 1 NOT NULL D