【发布时间】:2017-09-22 15:34:43
【问题描述】:
我有一个包含 3 个表的数据库。
CREATE TABLE `records` (
`id` int(6) NOT NULL auto_increment,
`nu` varchar(40) NOT NULL UNIQUE,
`name` varchar(128),
`latitude` float NOT NULL,
`longitude` float NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `categories` (
`category_id` int(11) NOT NULL,
`category_label` varchar(100) NOT NULL UNIQUE,
PRIMARY KEY (`category_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `relational` (
`r_id` int(6) NOT NULL auto_increment,
`id` int(6) NOT NULL,
`category_id` int(11) NOT NULL auto_increment,
PRIMARY KEY (`r_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
我还有 2 个外键,category_id 和 id。
我也为 category_label 和 latitude 创建了索引。
我的查询是这样的
SELECT id, name, latitude, longitude, category_label, ( 6371 * acos( cos(
radians('$lat') ) * cos( radians( latitude ) ) * cos( radians( longitude ) -
radians('$lng') ) + sin( radians('$lat') ) * sin( radians( latitude ) ) ) )
AS distance, FROM records JOIN relational ON records.id = relational.id
JOIN categories ON relational.category_id = categories.category_id
WHERE category_label = '$label' GROUP BY distance HAVING (distance <=
'$radius') ORDER BY distance
我的问题是我的数据库很大,而且查询运行时间过长。我应该为此查询使用哪些索引。实际上,我不知道哪种索引可以帮助我确定距离的正确方法。我应该更改索引吗?如何改进我的数据库结构或查询?我正在使用 InnoDB。
【问题讨论】:
-
在您的查询上运行
EXPLAIN并发布结果。
标签: php mysql indexing latitude-longitude sql-optimization