gpt4 book ai didi

mysql - 子查询(以及带有连接的查询)不使用 MySQL 索引 (MyISAM)

转载 作者:行者123 更新时间:2023-11-30 00:43:30 25 4
gpt4 key购买 nike

我试图找出为什么这个查询在非常大的数据库(40M+行)上非常慢。问题似乎出在“WHERE users_fb_table.installed = 1”子句上。

SELECT users_fb_table.`id_user_fb`, `id_fb`, `first_name`
FROM (
SELECT `id_user`, `id_user_fb`
FROM friends_table
WHERE friends_table.`id_user` = 10
) AS temp
JOIN users_fb_table ON temp.`id_user_fb` = users_fb_table.`id_user_fb`
WHERE users_fb_table.`installed` = 1

我尝试过不使用子查询,但结果是一样的。以下查询返回相同的结果集(30 行),并且执行时间完全相同:

SELECT friends_table.`id_user_fb`, `id_fb`, `first_name`
FROM friends_table
JOIN users_fb_table ON friends_table.`id_user_fb` = users_fb_table.`id_user_fb`
WHERE friends_table.`id_user` = 10 and users_fb_table.`installed` = 1

下面的查询速度非常快:

SELECT friends_table.`id_user_fb`, `id_fb`, `first_name`
FROM friends_table
JOIN users_fb_table ON friends_table.`id_user_fb` = users_fb_table.`id_user_fb`
WHERE friends_table.`id_user` = 10 limit 30

这个也非常快:

SELECT`id_user_fb`, `id_fb`, `first_name`
FROM users_fb_table
WHERE users_fb_table.`installed` = 1 limit 30

两个表的创建语句:

CREATE TABLE IF NOT EXISTS `users_fb_table` (
`id_user_fb` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`id_fb` bigint(20) NOT NULL,
`first_name` varchar(128) NOT NULL,
`last_name` varchar(128) NOT NULL,
`full_name` varchar(128) NOT NULL,
`username` varchar(128) NOT NULL,
`gender` char(30) NOT NULL,
`birthday` char(128) NOT NULL,
`locale` char(64) NOT NULL,
`installed` tinyint(1) NOT NULL,
`email` char(128) NOT NULL,
`location` varchar(128) NOT NULL,
PRIMARY KEY (`id_user_fb`),
UNIQUE KEY `id_fb` (`id_fb`),
KEY `installed` (`installed`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

CREATE TABLE IF NOT EXISTS `friends_table` (
`id_friend` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`id_user` bigint(20) unsigned NOT NULL,
`id_user_fb` bigint(20) unsigned NOT NULL,
PRIMARY KEY (`id_friend`),
UNIQUE KEY `id_index` (`id_user`,`id_user_fb`),
KEY `id_user` (`id_user`),
KEY `id_user_fb` (`id_user_fb`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

我可以做些什么来加快执行速度?我试图创建一个带索引的子查询但没有成功。

感谢您的帮助。

最佳答案

您的查询不具有可比性。最后两个运行“快速”的使用 limit 子句。您的查询没有。尝试向您的查询添加 limit 30 看看它是否运行得更快。也可能不会,因为查询可能需要遍历 30 多条记录才能找到 30 条满足安装条件的记录。

使用limit表明每个用户在fb表中有很多行匹配。如果是这样,请尝试此索引:users_fb_table(id_user_fb, displayed)。该索引可用于 joinwhere 条件。

实际上,更好的索引是users_fb_table(id_user_fb,installed,id_fb,first_name)。该查询“覆盖”了查询,因此执行引擎只需使用索引即可满足查询,而不必引用数据页。

关于mysql - 子查询(以及带有连接的查询)不使用 MySQL 索引 (MyISAM),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21579084/

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