php - MySQL 在同一张表上的连接性能

标签 php mysql sql

我有一个包含 2100 万条记录的表,托管在 2Ghz 2GB GoDaddy VPS 上,我想知道我是否遇到了硬件限制,或者有什么方法可以更好地优化此查询。

SELECT COUNT( DISTINCT a.another_id ) 
FROM table a
INNER JOIN table b ON a.some_id =  '12384211026'
AND b.some_id =  '7961985974'
AND a.another_id = b.another_id

查询大约需要 14 秒到 2 分钟才能运行,具体取决于比较的 ID。

有什么建议吗?

更新:这是架构

CREATE TABLE `table` (
    `id` BIGINT(55) NOT NULL AUTO_INCREMENT,
    `another_id` VARCHAR(50) NOT NULL,
    `category_id` VARCHAR(4) NOT NULL,
    `name` VARCHAR(255) NOT NULL,
    `category` VARCHAR(55) NOT NULL,
    `some_id` VARCHAR(50) NOT NULL,
    `created_time` VARCHAR(55) NOT NULL,
    `processed` SMALLINT(2) NOT NULL,
    PRIMARY KEY (`id`),
    UNIQUE INDEX `some` (`another_id`, `some_id`),
    INDEX `some_index` (`another_id`, `some_id`, `category_id`, `category`),
    FULLTEXT INDEX `name` (`name`),
FULLTEXT INDEX `some_id` (`some_id`),
    FULLTEXT INDEX `some_id` (`some_id`),
    FULLTEXT INDEX `category_id` (`category_id`),
    FULLTEXT INDEX `category` (`category`),
    FULLTEXT INDEX `created_time` (`created_time`)
)
COLLATE='utf8_general_ci'
ENGINE=MyISAM
AUTO_INCREMENT=23902326;

最佳答案

基于多个字段的连接,MySQL 可能会非常慢。 此外,您的 DISTINCT 可能比 GROUP 慢。

确保所有字段都已编入索引后,尝试此查询:

SELECT COUNT(`a`.`another_id`) 
FROM `table` AS `a` 
    INNER JOIN `table` AS `b` 
        ON `a`.`another_id` = `b`.`another_id` 
WHERE `a`.`some_id` = '12384211026' 
    AND `b`.`some_id` = '7961985974' 
GROUP BY `a`.`another_id`;

关于php - MySQL 在同一张表上的连接性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20305387/

相关文章:

mysql - 使用SQL将varchars转换为两点十进制值

php - 如何从RSA的公开指数和模数生成DER/PEM证书?

mysql - 从 map 和计数中获得最佳结果

php - 如何对值求和并合并重复记录

mysql - 使用关系数据库进行 Map Reduce

php - 如何将数据库中最后两个插入值的 id 匹配到包含相同值的新数组

mysql - mysql 8.0 上的 "group by desc"语法错误在 5.7 上没问题

php - 如何在所有测试完成之前显示失败的 PHPUnit 测试的名称

php - 创建内部包含不同变量的 php 副本

javascript - 通过 PHP 通过电子邮件发送 textarea HTML 代码以显示为 html