- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
以下查询(不是我写的)根据距离计算在包含 50,000 条记录的表中进行搜索。我第一次运行它(在 phpMyAdmin 中)时,它运行时间不到 0.25 秒。如果我立即再次运行它,则需要 30 多秒。我尝试添加 SQL_NO_CACHE
但没有任何区别。由于在生产中同一个查询可能会在短时间内多次运行,这是一个主要问题。
请注意,如果用户在搜索页面上选择额外的标准(关键字),这需要在其中进行字符串搜索的连接表,问题就会消失;我假设首先完成文本搜索,从而减少距离计算。 (这就是主键上有 GROUP BY 的原因;这些扩展搜索可以产生 PK 的多个实例。)
另请注意,在我的本地测试系统上,无论我重新运行查询多少次,该查询的运行时间都不到 0.02 秒。
这是查询(从实际搜索页面生成的示例):
SELECT
`cc6177_clients`.*,
ACOS(SIN(RADIANS(`b1e39c_client_lat`)) * SIN(RADIANS(51.0486151)) + COS(RADIANS(`b1e39c_client_lat`)) * COS(RADIANS(51.0486151)) * COS(RADIANS(`b1e39c_client_long`) - RADIANS(- 114.0708459))) * 3964
AS `distance`
FROM
`cc6177_clients`
WHERE
(b1e39c_client_status = '1'
AND b1e39c_client_profile_status = '1'
AND b1e39c_client_type = 'provider')
GROUP BY `b1e39c_client_id`
HAVING (distance <= 50)
ORDER BY `b1e39c_client_company_name` ASC
LIMIT 8
这是 EXPLAIN 输出:
1 SIMPLE cc6177_clients ref PRIMARY,client_email,client_company_name,main_search main_search 3 const,const,const 26564 Using index condition; Using where; Using filesort
这是创建表:
CREATE TABLE `cc6177_clients` (
`b1e39c_client_id` int(11) NOT NULL AUTO_INCREMENT,
`b1e39c_client_type` enum('client','provider') COLLATE utf8_unicode_ci NOT NULL,
`b1e39c_client_login_type` enum('normal','social') COLLATE utf8_unicode_ci NOT NULL DEFAULT 'normal',
`b1e39c_client_oauth_provider` enum('facebook','gplus') COLLATE utf8_unicode_ci DEFAULT NULL,
`b1e39c_client_oauth_id` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`b1e39c_client_access_token` text COLLATE utf8_unicode_ci,
`b1e39c_client_referrer_key` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`b1e39c_client_nickname` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`b1e39c_client_email` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`b1e39c_client_password` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`b1e39c_client_first_name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`b1e39c_client_last_name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`b1e39c_client_picture` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`b1e39c_client_country_code` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`b1e39c_client_contact_number` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`b1e39c_client_address` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`b1e39c_client_lat` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`b1e39c_client_long` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`b1e39c_client_city` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`b1e39c_client_state` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`b1e39c_client_postal_code` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`b1e39c_client_status` enum('0','1') COLLATE utf8_unicode_ci NOT NULL DEFAULT '1' COMMENT '0=>Not Active,1=>Active',
`b1e39c_client_activation_key` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT 'It is used for account activation or reset password request key',
`b1e39c_client_verified` enum('0','1') COLLATE utf8_unicode_ci NOT NULL DEFAULT '0' COMMENT 'It is used to verify client email address(0=>not Verified,1=>Verified)',
`b1e39c_client_registered_on` datetime NOT NULL,
`b1e39c_client_login_failed_count` int(2) NOT NULL,
`b1e39c_client_login_failed_time` datetime DEFAULT NULL,
`b1e39c_client_login_ip` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`b1e39c_client_last_login` datetime DEFAULT NULL,
`b1e39c_client_view_status` enum('0','1') COLLATE utf8_unicode_ci NOT NULL,
`b1e39c_client_delete_status` enum('0','1') COLLATE utf8_unicode_ci NOT NULL DEFAULT '1' COMMENT '0=>client deleted, 1=> client active',
`b1e39c_client_verify_email_link_exp` datetime DEFAULT NULL,
`b1e39c_client_company_name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`b1e39c_client_website_address` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`b1e39c_client_company_logo` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT 'Provider Company Logo',
`b1e39c_client_desc` text COLLATE utf8_unicode_ci,
`b1e39c_client_category_id` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`b1e39c_client_sub_category_id` int(11) DEFAULT NULL,
`b1e39c_client_claim_option` enum('0','1','2') COLLATE utf8_unicode_ci NOT NULL DEFAULT '0' COMMENT '0=>default,1=>User Added By Admin,2=>claim then make main provider',
`b1e39c_client_membership_id` int(11) DEFAULT NULL COMMENT 'client current membership table unique id',
`b1e39c_client_cur_membership_id` int(11) DEFAULT NULL COMMENT 'client currency membership',
`b1e39c_client_membership_type` enum('free','paid') COLLATE utf8_unicode_ci DEFAULT NULL COMMENT 'client membership type',
`b1e39c_client_profile_status` enum('0','1') COLLATE utf8_unicode_ci NOT NULL DEFAULT '0',
`b1e39c_client_profile_cover` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`b1e39c_client_id`),
UNIQUE KEY `client_email` (`b1e39c_client_email`),
KEY `client_company_name` (`b1e39c_client_company_name`),
KEY `main_search` (`b1e39c_client_status`,`b1e39c_client_profile_status`,`b1e39c_client_type`)
) ENGINE=InnoDB AUTO_INCREMENT=55931 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
最佳答案
不要到处使用 VARCHAR(255)
;使用合理的限制。 (这将有助于提高当前所需的临时表的性能。
在 WHERE
子句中使用“边界框”,加上 INDEX(lat), INDEX(long)
。 (见下文。)
不要用常量前缀 (b1e39c_client_
) 使 SQL 困惑。 (人类的东西。)
去掉GROUP BY
;除了减慢查询速度之外,它对这个 查询没有任何帮助。 (这消除了不必要的数据传递。)
这些都无法解释为什么第一次运行明显快于下一次运行。
“边界框”类似于
AND lat BETWEEN .. AND ..
AND long BETWEEN .. AND ..
填充的值距源纬度/经度 50 个单位。 (请注意,对于 long
测试,您需要除以 cosd(lat)。)
这会将查询速度提高一个数量级,从而使查询速度如此之快以至于您的原始问题变得没有实际意义。
没有边界框,这可能会有所帮助:
INDEX(status, profile_status, type, -- in any order
company_name) -- last
如果你想追问原来的问题,看看你是否可以得到 EXPLAIN SELECT ...
来显示两个不同的输出。
关于重复时 MySQL 查询运行速度变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55087418/
我在想出一个算法时遇到了麻烦... 我有一系列 GPS 数据,以 1 秒为间隔记录时间、速度、距离。假设距离是米,速度是米/秒。可能有超过 2 小时的数据,或 7200 个点。这里的“时间”字段主要是
使用java排序器,即: Collections.sort(myArrayList, new Comparator() { @Override public int c
有什么区别吗 SELECT * FROM my_table 和 SELECT my_column_id FROM my_table 地点: my_table 有百万行 网站上有大量并发用户进行sql查
有2个样本。 在第一个示例中,使用 orderby 可以更快地获得结果。 (根据 phpmyadmin 速度报告) 在另一个例子中,我没有使用 order by,它给出的结果较慢。 (根据 phpmy
我注意到,如果我将训练数据加载到内存中并将其作为 numpy 数组提供到图中,与使用相同大小的 shuffle 批次相比,速度会有很大差异,我的数据有大约 1000 个实例。 使用内存 1000 次迭
我在 python 中使用破折号。我正在绘制记录到 SQLite 数据库中的实时数据,目前,我正在绘制单个值与时间线图。我计划再添加 20 个图表,但目前,随着时间的增加, plotly 变慢,我认为
我试图调用 hasNext Velocity 模板中的方法,以便根据 foreach 循环中的位置影响行为 - 仅 hasNext没有按照文档工作。 这是 Velocity 用户指南的片段,关于 ha
在我正在制作的游戏中,我有两个点,pt1 和 pt2,我想计算出它们之间的角度。我已经在较早的计算中计算出距离。显而易见的方法是对垂直距离上的水平距离进行反正切 (tan(theta) = opp/a
我经常遇到字符串值不存在和/或为空的情况。这是测试这种情况的最佳方法吗? #if( $incentive.disclaimer && $!incentive.disclaimer != '' )
我想将一个模板nested包含在其他模板cont1,cont2和cont3中。 并且嵌套模板应仅对cont1隐藏一个特定控件。 在包含在cont1中之前,我想为一些标志变量$hideMyControl
是否可以更改从“Windows Azure Media Encoder”输出的音频的播放速度? 我正在使用配置为“WMA High Quality Audio”的“Windows Azure Medi
我使用速度将String(template)与字段合并 hi there I'am ${name}, And I'am ${age} old. velocity将字段${name}和${age}与一种
我使用的是 LockedBitmap 类,它简化了 C# 中位图数据的处理。目前它正在将数据复制到本地 byte[] 数组中,然后通过其类方法访问该数组以获取/设置像素颜色值。 这比直接通过指针访问锁
我尝试在 VM_global_library.vm 文件中添加一堆 #set($x=abc) 语句,但这些变量在我的 VM 模板中不可用。 我想为图像的基本路径等设置一个全局变量。这可能吗? 最佳答案
我的项目结构: -src --main ---java ----makers -----SomeClass ---resources ----htmlPattern.vm 如何告诉 SomeClass
我正在尝试从 Velocity 中的字符串中删除不需要的字符(换行符可以,但不能像 EM 和 CAN ASCII 控制字符那样)。 #set($cleanScreen = $cleanScreen.r
我想在日.月.年之间的点处分割日期。例如:2015 年 1 月 14 日至 {14, 01, 2015}这是我使用的代码:dates3.get(0) 包含我从页面的文本字段获取的字符串“14.01.2
之后,从 1.5 升级到速度引擎 1.7 出现了 1.5 没有的问题。为了解释这个问题,我必须展示一个代码片段: #foreach($someVariable in $someCollection)
我想知道从表中选择所有字段是否更快: SELECT * 或只选择您真正需要的: SELECT field1, field2, field3, field4, field5... 假设表有大约 10 个
我正在尝试模仿照片应用程序的行为,在该应用程序中,用户用手指平移照片并且照片具有一定的速度。由于我不会深入的原因,我不能将 UIScrollView 与它的缩放 UIImageView 一起使用,而是
我是一名优秀的程序员,十分优秀!