gpt4 book ai didi

mysql查询内部连接变慢

转载 作者:行者123 更新时间:2023-11-29 07:03:45 26 4
gpt4 key购买 nike

我有以下数据库结构:

CREATE TABLE IF NOT EXISTS `business` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`address` varchar(255) NOT NULL,
`city` varchar(255) NOT NULL,
`state` varchar(255) NOT NULL,
`postal` int(11) NOT NULL,
`country` varchar(255) NOT NULL,
`lat` float NOT NULL,
`lng` float NOT NULL,
`name` varchar(255) NOT NULL,
`phone` varchar(255) NOT NULL,
`email` varchar(255) NOT NULL,
`website` varchar(255) NOT NULL,
`userID` bigint(20) NOT NULL,
`url` varchar(255) NOT NULL,
`timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`clicks` bigint(20) NOT NULL,
`oHours` varchar(255) NOT NULL,
`featured` tinyint(1) NOT NULL,
`imageThumb` varchar(255) NOT NULL DEFAULT 'default.jpg',
`imageOrig` varchar(255) NOT NULL DEFAULT 'default.jpg',
`flag` tinyint(1) NOT NULL,
`display` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=589846 ;

这个表(业务)有 507,736 条记录

CREATE TABLE IF NOT EXISTS `businesscat` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`bizID` bigint(20) NOT NULL,
`catID` bigint(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=589863 ;

这张表(businesscat)有519,825条记录

CREATE TABLE IF NOT EXISTS `category` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`url` varchar(255) NOT NULL,
`icon` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;

这个表(类别)只有5条记录

所以,我的问题是我试图通过使用 ff 计算最近的业务来获取 100 条记录:

SELECT business.name
, business.lng
, business.lat
, business.address
, business.city
, business.state
, business.postal
, business.phone
, business.url
, business.imageThumb
, businesscat.catID
, category.icon
, (((acos(sin((".$lat."*pi()/180))
* sin((business.lat*pi()/180))
+ cos((".$lat."*pi()/180))
* cos((business.lat*pi()/180))
* cos(((".$lng."-business.lng)*pi()/180))))
* 180/pi())*60*1.1515) AS distance
FROM business
INNER JOIN businesscat ON businesscat.bizID=business.id
INNER JOIN category ON category.id=businesscat.catID
ORDER BY distance LIMIT 100

有什么让它更快的想法吗?

最佳答案

我刚刚在 MySQL 手册中看到子查询可以包含 ORDER BY 和 LIMIT。所以,我的建议是:

将您的距离计算与 ORDER BY 和 LIMIT 子句一起放在单独的子查询中。然后,将您的联接放入封闭(外部)查询中。这样一来,您的加入操作将不会针对您感兴趣的领域之外的数十万家企业执行。

还要确保您已经为 businesscat.bizID 和 businesscat.catID 定义了索引。

编辑:如果这不能使您的查询速度满足您的目的,请尝试以下操作:

在输入查询之前,计算“最小”和“最大”经度和纬度($lng 和 $lat 的北、西、东和南各 100 米。)然后,使用这些来预过滤您的内部查询中的业务如下:WHERE business.lng >= $min_lng AND business.lng <= $max_lng AND business.lat >= $min_lat AND business.lat <= $max_lat .然后,在封闭查询中计算距离并根据它重新过滤。当然,这可以通过在 business.lng 和 business.lat 上定义索引来进一步优化。

关于mysql查询内部连接变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8635594/

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