【发布时间】:2020-12-17 02:56:27
【问题描述】:
我有两个表 kw 有 250000 条记录,t_n 有 100000 条记录。
我加入了两个表以在以下查询中获得集体结果:
SELECT kw.id AS kw_id,
kw.word AS kw_word,
t_n.translation AS t_n_translation
FROM kw, t_n
WHERE kw.id = t_n.keyword_id
AND kw.word LIKE '1%'
GROUP BY t_n.translation
LIMIT 10
我还尝试了以下简单连接作为上述查询的替代方法:
SELECT kw.id AS kw_id,
kw.word AS kw_word,
t_n.translation AS t_n_translation
FROM kw
INNER JOIN t_n
ON kw.id = t_n.keyword_id
AND kw.word LIKE '1%'
GROUP BY t_n.translation
LIMIT 10
但是这两个查询都需要大约 60 到 150 秒,具体取决于内存和处理的系统资源。
这种执行超时对于扩展数据库和增加多个用户来说是难以忍受的。
有没有什么有效的方法可以连接两个巨大的表?
更新
此查询用于 JQuery UI 自动完成。我使用 GROUP BY 子句来获取不同的值。是否有任何其他合适的解决方案来获得不同的值。
表格结构
--
-- Table structure for table `kw`
--
CREATE TABLE `kw` (
`id` int(32) NOT NULL,
`word` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`pos` varchar(12) NOT NULL,
`definition` text NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-- --------------------------------------------------------
--
-- Table structure for table `t_n`
--
CREATE TABLE `t_n` (
`id` int(16) NOT NULL,
`keyword_id` int(16) NOT NULL,
`translation` varchar(64) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`created_on` datetime NOT NULL,
`user_id` varchar(64) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--
-- Indexes for dumped tables
--
--
-- Indexes for table `kw`
--
ALTER TABLE `kw`
ADD PRIMARY KEY (`id`);
--
-- Indexes for table `t_n`
--
ALTER TABLE `t_n`
ADD PRIMARY KEY (`id`);
--
-- AUTO_INCREMENT for dumped tables
--
--
-- AUTO_INCREMENT for table `kw`
--
ALTER TABLE `kw`
MODIFY `id` int(32) NOT NULL AUTO_INCREMENT;
--
-- AUTO_INCREMENT for table `t_n`
--
ALTER TABLE `t_n`
MODIFY `id` int(16) NOT NULL AUTO_INCREMENT;
COMMIT;
【问题讨论】:
-
能否附上执行计划?
-
在没有任何聚合函数的情况下,GROUP BY 子句永远不合适。如需进一步帮助,请参阅meta.stackoverflow.com/questions/333952/…
-
1) 删除 GROUP BY - 这在逻辑上是错误的。 2)根据索引创建(我建议测试
kw (word, id)和t_n (keyword_id, translation)。 -
没有排序的限制很少有意义。
-
请提供
SHOW CREATE TABLE。