MySQL 在没有缓存的情况下增强性能

2024-03-17

我正在使用 MySQL 版本 5.5.14 从 500 万行的表运行以下查询:

SELECT P.ID, P.Type, P.Name, P.cty
     , X(P.latlng) as 'lat', Y(P.latlng) as 'lng'
     , P.cur, P.ak, P.tn, P.St, P.Tm, P.flA, P.ldA, P.flN
     , P.lv, P.bd, P.bt, P.nb
     , P.ak * E.usD as 'usP' 
FROM PIG P 
  INNER JOIN EEL E 
    ON E.cur = P.cur 
WHERE act='1' 
  AND flA >= '1615' 
  AND ldA >= '0' 
  AND yr >= (YEAR(NOW()) - 100) 
  AND lv >= '0' 
  AND bd >= '3' 
  AND bt >= '2' 
  AND nb <= '5' 
  AND cDate >= NOW() 
  AND MBRContains(LineString( Point(-65.6583, -87.8906)
                            , Point(65.6583, 87.8906)
                            ), latlng) 
  AND Type = 'g' 
  AND tn = 'l' 
  AND St + Tm - YEAR(NOW()) >= '30' 
HAVING usP BETWEEN 300/2 AND 300 LIMIT 100;

表定义为:

CREATE TABLE `PIG` (
  `ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `Email` char(50) NOT NULL,
  `Type` char(1) NOT NULL,
  `Name` char(25) DEFAULT NULL,
  `cty` char(2) DEFAULT NULL,
  `latlng` point NOT NULL,
  `tn` char(1) NOT NULL DEFAULT 'l',
  `St` smallint(4) unsigned NOT NULL DEFAULT '0',
  `Tm` smallint(3) unsigned NOT NULL DEFAULT '0',
  `yr` smallint(4) unsigned NOT NULL DEFAULT '0',
  `flA` mediumint(6) unsigned NOT NULL DEFAULT '0',
  `ldA` mediumint(6) unsigned NOT NULL DEFAULT '0',
  `flN` smallint(3) unsigned NOT NULL DEFAULT '1',
  `lv` smallint(3) unsigned NOT NULL DEFAULT '0',
  `bd` tinyint(2) unsigned NOT NULL DEFAULT '0',
  `bt` tinyint(2) unsigned NOT NULL DEFAULT '0',
  `nb` tinyint(1) unsigned NOT NULL DEFAULT '9',
  `cur` char(3) DEFAULT NULL,
  `ak` int(10) unsigned NOT NULL DEFAULT '0',
  `Des` tinytext,
  `pDate` datetime DEFAULT NULL,
  `cDate` date DEFAULT NULL,
  `act` tinyint(1) unsigned NOT NULL DEFAULT '0',
  `bid` tinyint(3) unsigned NOT NULL DEFAULT '0',
  `ab` tinyint(3) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`ID`),
  KEY `id_ca` (`cty`,`ak`),
  SPATIAL KEY `id_latlng` (`latlng`)
) ENGINE=MyISAM AUTO_INCREMENT=5000001 DEFAULT CHARSET=latin1

And:

CREATE TABLE `EEL` (
  `cur` char(3) NOT NULL,
  `usD` decimal(11,10) NOT NULL,
  PRIMARY KEY (`cur`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1

查询执行计划如下所示:

*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: P
         type: range
possible_keys: id_latlng
          key: id_latlng
      key_len: 34
          ref: NULL
         rows: 742873
        Extra: Using where
*************************** 2. row ***************************
           id: 1
  select_type: SIMPLE
        table: E
         type: eq_ref
possible_keys: PRIMARY
          key: PRIMARY
      key_len: 3
          ref: BS.P.cur
         rows: 1
        Extra: 

由于 NOW() 函数的存在,该查询不使用查询缓存。从我之前的posting https://stackoverflow.com/questions/7429336/mysql-erratic-query-times,我发现存在其他形式的缓存来加速从初始时间开始的查询300秒降至不到2秒。我的问题是:“由于 latlng 的搜索条件不断变化,因此知道缓存不会有太大用处,如何改善上述查询时间?" 请注意,出于优化目的,已经构建了 latlng 的空间索引。

干杯,本


好的索引是具有高选择性的索引。您的条件主要是范围条件,这对可在复合索引中使用的字段造成了限制。

可能要调查的索引(由具有相等性检查的字段组成,最后添加一个具有范围检查的字段):

(act, Type, tn, flA)

(act, Type, tn, cDate)

(act, Type, tn, nb)

要在不创建索引的情况下检查选择性,您可以使用:

SELECT COUNT(*)
FROM PIG P 
WHERE act='1' 
  AND Type = 'g' 
  AND tn = 'l' 
  AND flA >= '1615'

and

SELECT COUNT(*)
FROM PIG P 
WHERE act='1' 
  AND Type = 'g' 
  AND tn = 'l' 
  AND cDate >= NOW() 

and

SELECT COUNT(*)
FROM PIG P 
WHERE act='1' 
  AND Type = 'g' 
  AND tn = 'l' 
  AND nb <= '5' 

并将输出与742873你从空间索引中得到的。

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

MySQL 在没有缓存的情况下增强性能 的相关文章

随机推荐

  • FastAPI 的 RedirectResponse 在 Swagger UI 中无法按预期工作

    我有一个带下载端点的 FastAPI 应用程序 此下载端点的作用是使用BlobServiceClient 对于 Azure Blob 存储 生成请求中指定的文件的令牌和 Blob URL 我想要做的是将用户重定向到该 URL 这是下载点的代
  • django apache 配置与 WSGIDaemonProcess 不起作用

    更新的问题 Mon Jul 18 09 20 10 517873 2016 error pid 30316 tid 139756302964480 remote 122 164 94 99 48261 Traceback most rece
  • Javascript导入函数语法[重复]

    这个问题在这里已经有答案了 我试图从另一个模块导入函数 但在运行时出现错误 TypeError this getData is not a function data js function getData return id 1 name
  • 是否有用于 ipv4 和 ipv6 地址的标准 .NET 解码器?

    我想编写一个相当简单的客户端 服务器网络应用程序 我只使用纯 IPv4 网络 但如果我的代码能够面向未来 那就太好了 我可能会使用 TcpListener TcpClient 因为WCF初步调查 http msdn microsoft co
  • 媒体查询是否继承媒体查询中未指定的值?

    我正在使用媒体查询和弹性框来使我的网站做出响应 我认为我在这里有点愚蠢 但说我有包装器的 css 类 如下所示 wrapper display flex flex wrap wrap width 100 margin 0 auto padd
  • 使用不同的符号表重新计算 Boost Spirit 解析的属性的最有效方法是什么?

    我正在使用 Boost Spirit 来实现某些软件中的功能 该功能允许用户输入将重复应用于输入流的数学方程 输入流值使用符号表示boost spirit qi symbols用户可以在他们的方程中引用 例如 out1 3 in1 in2
  • ChildProcess关闭、退出事件之间的区别

    当通过生成子进程时spawn exec 在 Node js 中 有一个 close and an exit 子进程上的事件 这两者有什么区别 什么时候需要使用什么 在 Node js 0 7 7 之前 子进程上只有 退出 事件 没有 关闭
  • 如何使用 PHP 页面使用自定义用户名验证的 WCF Web 服务?

    我很难从 PHP 站点使用安全的 WCF Web 服务 我对 PHP 的了解有限 我在网上找到了各种示例 但还没有成功地使它们工作 我有一个 Silverlight 应用程序也使用这个 WebService 并且它工作正常 但是当我运行 P
  • 如何使用 git 仅暂存新文件的一部分?

    I love git add 交互式 现在它已成为我日常工作流程的一部分 问题似乎不适用于未跟踪的文件 我想要做的是跟踪一个新文件 但只添加其中的一部分 即这个新文件的某些部分尚未准备好进行暂存 例如 使用 git add i 我可以选择补
  • 插件Android支持异常,Worker因异常退出

    我刚刚在 Linux 上更新到 Android Studio 2 2 2 稳定版 现在经常崩溃 已经尝试过 使缓存无效 重新启动 清洁工程 删除 gradle 缓存 rm gradle caches rf 删除 Android Studio
  • 如何将 sitemap.xml 添加到 angularJS 站点?

    我在应用程序文件夹中添加了 sitemap xml 但如何将其公开以便谷歌网站管理员工具可以获取它 Thanks 来自谷歌的文档 有两种不同的方法可以让 Google 可以使用您的站点地图 OR 插入 在 robots txt 文件中的任意
  • 通过指针访问是否会改变严格的别名语义?

    有了这些定义 struct My Header uintptr t bits struct Foo Type struct My Header header int x struct Foo Type foo struct Bar Type
  • 信号栈

    我确实读到信号需要有一个单独的堆栈 您认为它为什么以及如何实现 它们是动态分配还是静态分配 内存分配是如何完成的 所有信号都一样吗 信号需要单独堆栈的原因是 如果正常堆栈损坏或溢出 信号仍然可以执行 我认为信号堆栈通常是动态分配的 但它可以
  • htmlspecialchars_decode() 不适用于空格

    我正在尝试使用 htmlspecialchars decode 但它不解码 nbsp 进入空间 这个问题有解决办法吗 My code query mysql query select from nowosci order by id des
  • 如何使用 Django/nginx 部署仅 HTTPS 的站点?

    我原来的问题是如何为 Django 登录页面启用 HTTPS https stackoverflow com questions 8015685 how to enable https in django auth generated pa
  • 如何使用 Selenium WebDriver 获取 HTTP 响应代码

    我已经使用 Selenium2 WebDriver 编写了测试 并且想要测试 HTTP 请求是否返回 HTTP 403 Forbidden 是否可以使用 Selenium WebDriver 获取 HTTP 响应状态代码 一句话 不 使用
  • 将图像图标添加到按钮/标签 Swing

    我知道这个问题已经发布了 但我已经尝试了我发现的所有内容 但没有任何效果 我有一个 Maven 项目 我想在按钮上使用图像 我把图像放在src main res folder Maven clean Maven 安装后 我的所有图像都可以在
  • 对对齐的 malloc 实现的解释

    这不是作业 这纯粹是为了我自己的个人教育 我不知道如何实现对齐的 malloc 所以在网上查找并发现这个网站 https sites google com site ruslancray lab bookshelf interview ci
  • 始终排除在 SVN for Netbeans 中提交的文件夹

    我使用Netbeans 7 0和内置的SVN客户端进行开发 我希望始终从提交 更新中排除某些文件和文件夹 例如 缓存 或 日志 因为它们对于存储库本身并不重要 我没有找到任何设置来执行此操作 而且 Netbeans 也没有在其常见问题解答中
  • MySQL 在没有缓存的情况下增强性能

    我正在使用 MySQL 版本 5 5 14 从 500 万行的表运行以下查询 SELECT P ID P Type P Name P cty X P latlng as lat Y P latlng as lng P cur P ak P