【发布时间】:2016-01-28 12:01:43
【问题描述】:
我是 MySQL 查询优化的新手,需要关于如何针对两个查询优化数据库的建议 - 我应该设置哪些索引以及在哪里设置。下面是数据库结构和查询。
CREATE TABLE `data_node` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`type` enum('node','place') DEFAULT NULL,
`name` varchar(255) DEFAULT '',
`source_id` bigint(20) unsigned DEFAULT NULL,
`data_id` bigint(20) unsigned NOT NULL,
`data_lat` decimal(8,6) NOT NULL,
`data_lon` decimal(9,6) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `data_node_tag` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`node_id` bigint(20) unsigned NOT NULL,
`data_key` varchar(255) NOT NULL DEFAULT '',
`data_value` varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
第一个查询:
SELECT *
FROM data_node n
LEFT JOIN data_node_tag nt ON nt.node_id = n.id
WHERE n.type = "place"
AND nt.data_value LIKE "%place%"
GROUP BY n.data_id LIMIT 100
第二次查询:
SELECT *
FROM data_node n
LEFT JOIN data_node_tag nt ON nt.node_id = n.id
WHERE n.source_id = 123
AND n.type = "node"
AND nt.data_value = "cafe"
AND (n.data_lat BETWEEN 1.000000 AND 2.000000)
AND (n.data_lon BETWEEN 3.000000 AND 4.000000)
GROUP BY n.data_id LIMIT 1000
我将不胜感激。
【问题讨论】:
-
请注意,您的两个查询都会检查 WHERE 子句中 LEFT OUTER JOINed 表中的值,从而使它们都有效地成为 INNER JOIN
-
他们使用聚合器,实际上没有聚合任何东西
标签: mysql query-optimization key-value entity-attribute-value