Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“优化MySQL”;在;选择?_Mysql_Database - Fatal编程技术网

“优化MySQL”;在;选择?

“优化MySQL”;在;选择?,mysql,database,Mysql,Database,我有以下MySQL查询: SELECT `influencers`.*, `locations`.`country_name` FROM `influencers` LEFT JOIN `locations` ON `influencers`.`country_id` = `locations`.`id` WHERE `is_dead` = 0 AND `influencers`.`is_private` = 0 AND `influenc

我有以下MySQL查询:

SELECT
    `influencers`.*,
    `locations`.`country_name`
FROM
    `influencers`
    LEFT JOIN `locations` ON `influencers`.`country_id` = `locations`.`id`
WHERE
    `is_dead` = 0
    AND `influencers`.`is_private` = 0
    AND `influencers`.`country_id` = '31'
    AND influencers.uuid IN(
        SELECT
            `influencer_uuid` FROM `category_influencer`
        WHERE
            `category_influencer`.`category_id` = 17
            AND `category_influencer`.`is_main` = 1)
ORDER BY
    `influencers`.`followed_by` DESC
LIMIT 7 OFFSET 6
我已经确定IN子查询导致完成此查询的延迟约为10秒。下面是解释:

我在所有被查询的列上都有索引

如何显著加快查询速度?

更新为
SHOW CREATE TABLE

位置

CREATE TABLE `locations` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `country_name` varchar(255) DEFAULT NULL,
    `city_name` varchar(255) DEFAULT NULL,
    `type` varchar(255) DEFAULT NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY `unique_index` (`city_name`, `country_name`),
    KEY `type` (`type`)
    USING BTREE) ENGINE = InnoDB AUTO_INCREMENT = 6479 DEFAULT CHARSET = utf8mb4
CREATE TABLE `influencers` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `bio` varchar(255) CHARACTER
    SET utf8mb4 DEFAULT NULL,
    `url` varchar(255) CHARACTER
    SET utf8mb4 DEFAULT NULL,
    `followed_by` int(11) DEFAULT NULL,
    `follows` int(11) DEFAULT NULL,
    `full_name` varchar(255) CHARACTER
    SET utf8mb4 NOT NULL,
    `social_id` varchar(255) DEFAULT NULL,
    `is_private` tinyint (1) DEFAULT NULL,
    `avatar` varchar(255) NOT NULL,
    `username` varchar(30) NOT NULL,
    `text_search` text CHARACTER
    SET utf8mb4 NOT NULL,
    `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
    `uuid` varchar(255) DEFAULT NULL,
    `is_dead` tinyint (4) DEFAULT NULL,
    `country_id` int(11) DEFAULT NULL,
    `city_id` int(11) DEFAULT NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY `username` (`username`),
    UNIQUE KEY `uuid` (`uuid`),
    KEY `is_dead` (`is_dead`),
    KEY `updated_at` (`updated_at`),
    KEY `followed_by` (`followed_by`),
    KEY `social_id` (`social_id`),
    KEY `is_private` (`is_private`),
    KEY `country_id` (`country_id`),
    FULLTEXT KEY `text_search` (`text_search`)) ENGINE = InnoDB AUTO_INCREMENT = 2278376 DEFAULT CHARSET = utf8
影响者

CREATE TABLE `locations` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `country_name` varchar(255) DEFAULT NULL,
    `city_name` varchar(255) DEFAULT NULL,
    `type` varchar(255) DEFAULT NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY `unique_index` (`city_name`, `country_name`),
    KEY `type` (`type`)
    USING BTREE) ENGINE = InnoDB AUTO_INCREMENT = 6479 DEFAULT CHARSET = utf8mb4
CREATE TABLE `influencers` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `bio` varchar(255) CHARACTER
    SET utf8mb4 DEFAULT NULL,
    `url` varchar(255) CHARACTER
    SET utf8mb4 DEFAULT NULL,
    `followed_by` int(11) DEFAULT NULL,
    `follows` int(11) DEFAULT NULL,
    `full_name` varchar(255) CHARACTER
    SET utf8mb4 NOT NULL,
    `social_id` varchar(255) DEFAULT NULL,
    `is_private` tinyint (1) DEFAULT NULL,
    `avatar` varchar(255) NOT NULL,
    `username` varchar(30) NOT NULL,
    `text_search` text CHARACTER
    SET utf8mb4 NOT NULL,
    `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
    `uuid` varchar(255) DEFAULT NULL,
    `is_dead` tinyint (4) DEFAULT NULL,
    `country_id` int(11) DEFAULT NULL,
    `city_id` int(11) DEFAULT NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY `username` (`username`),
    UNIQUE KEY `uuid` (`uuid`),
    KEY `is_dead` (`is_dead`),
    KEY `updated_at` (`updated_at`),
    KEY `followed_by` (`followed_by`),
    KEY `social_id` (`social_id`),
    KEY `is_private` (`is_private`),
    KEY `country_id` (`country_id`),
    FULLTEXT KEY `text_search` (`text_search`)) ENGINE = InnoDB AUTO_INCREMENT = 2278376 DEFAULT CHARSET = utf8

可以使用内部联接来避免in子句

    SELECT
        `influencers`.*,
        `locations`.`country_name`
    FROM
        `influencers`
    INNER JOIN  (
        SELECT
                `influencer_uuid` FROM `category_influencer`
            WHERE
                `category_id` = 17
                AND `is_main` = 1

    ) T ON T.influencer_uuid = influencers.uuid
        LEFT JOIN `locations` ON `influencers`.`country_id` = `locations`.`id`
    WHERE
        `is_dead` = 0
        AND `is_private` = 0
        AND `country_id` = '31'

    ORDER BY
        `followed_by` DESC
    LIMIT 7 OFFSET 6

通过这种方式,您可以使用基于join的单个关系匹配,而不是对所有IN结果进行迭代,您可以使用内部join避免IN子句

    SELECT
        `influencers`.*,
        `locations`.`country_name`
    FROM
        `influencers`
    INNER JOIN  (
        SELECT
                `influencer_uuid` FROM `category_influencer`
            WHERE
                `category_id` = 17
                AND `is_main` = 1

    ) T ON T.influencer_uuid = influencers.uuid
        LEFT JOIN `locations` ON `influencers`.`country_id` = `locations`.`id`
    WHERE
        `is_dead` = 0
        AND `is_private` = 0
        AND `country_id` = '31'

    ORDER BY
        `followed_by` DESC
    LIMIT 7 OFFSET 6

通过这种方式,您可以使用基于连接的单个关系匹配,而不是对所有结果进行迭代,除非我遗漏了什么,否则您可以使用连接替换子选择:

SELECT influencers.*,
       locations.country_name
FROM influencers
         JOIN category_influencer T ON (
            T.influencer_uuid = influencers.uuid
            AND category_id = 17
            AND is_main = 1)
         LEFT JOIN locations ON influencers.country_id = locations.id
WHERE is_dead = 0
  AND is_private = 0
  AND country_id = '31'

ORDER BY followed_by DESC
LIMIT 7 OFFSET 6

除非我遗漏了什么,否则您可以将subselect替换为JOIN:

SELECT influencers.*,
       locations.country_name
FROM influencers
         JOIN category_influencer T ON (
            T.influencer_uuid = influencers.uuid
            AND category_id = 17
            AND is_main = 1)
         LEFT JOIN locations ON influencers.country_id = locations.id
WHERE is_dead = 0
  AND is_private = 0
  AND country_id = '31'

ORDER BY followed_by DESC
LIMIT 7 OFFSET 6

在每列前面加上它所属的表(或者更好,加上表的别名)。您可能很清楚每列的位置,但我们不清楚。另外,请向我们展示索引的代码。除了解释之外,有关查询性能的问题始终需要所有相关的show CREATE TABLE语句tables@TheImpaler我已经在上面的列前面加了前缀,在每个列前面加了表(或者更好,使用表的别名)它所属的位置。您可能很清楚每一列的位置,但我们不清楚。另外,请向我们展示索引的代码。除了解释之外,有关查询性能的问题始终需要所有相关的show CREATE TABLE语句tables@TheImpaler我已经预先准备了上面的专栏,谢谢,但这仍然需要13秒来执行,bu如果我删除对
category\u influencer
的查询,只需要不到1秒的时间。最奇怪的是,在每个被查询的
category\u influencer
列上都有索引-真的不知道如何优化它吗?谢谢,但这仍然需要13秒的时间来执行,但如果我删除对
ca的查询,只需要不到1秒的时间tegory_influencer
。最奇怪的是,在每个被查询的
类别_influencer
列上都有索引-真的不知道如何优化它吗?