当前位置: 首页 > 面试题库 >

如何在MySQL中通过连接提高性能的顺序

晁开宇
2023-03-14
问题内容

我正在开发一个社交网络跟踪应用程序。即使连接正确,也可以正常工作。但是,当我添加order by子句时,总查询执行时间要长100倍。我用于获取不带order
by子句的twitter_users的以下查询。

SELECT DISTINCT  `tracked_twitter`.id
FROM tracked_twitter
INNER JOIN  `twitter_content` ON  `tracked_twitter`.`id` = `twitter_content`.`tracked_twitter_id` 
INNER JOIN  `tracker_twitter_content` ON  `twitter_content`.`id` = `tracker_twitter_content`.`twitter_content_id` 
AND  `tracker_twitter_content`.`tracker_id` =  '88'
LIMIT 20

显示第0-19行(共20行,查询耗时0.0714秒)

但是当我添加order by子句(在索引列上)时

SELECT DISTINCT  `tracked_twitter`.id
FROM tracked_twitter
INNER JOIN  `twitter_content` ON  `tracked_twitter`.`id` =  `twitter_content`.`tracked_twitter_id` 
INNER JOIN  `tracker_twitter_content` ON  `twitter_content`.`id` =  `tracker_twitter_content`.`twitter_content_id` 
AND  `tracker_twitter_content`.`tracker_id` =  '88'
ORDER BY tracked_twitter.followers_count DESC 
LIMIT 20

显示第0-19行(共20行,查询耗时13.4636秒)

解释
在此处输入图片说明

当我仅在其表中实现order by子句时,不会花费太多时间

SELECT * FROM `tracked_twitter` WHERE 1 order by `followers_count` desc limit 20

显示第0-19行(共20行,查询耗时0.0711秒)[followers_count:68236387-10525612]

表创建查询如下

CREATE TABLE IF NOT EXISTS `tracked_twitter` (
    `id` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
    `handle` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
    `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
    `location` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
    `description` text COLLATE utf8_unicode_ci,
    `profile_image` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
    `followers_count` int(11) NOT NULL,
    `is_influencer` tinyint(1) NOT NULL DEFAULT '0',
    `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
    `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
    `gender` enum('Male','Female','Other') COLLATE utf8_unicode_ci 
     DEFAULT NULL,
     PRIMARY KEY (`id`),
     KEY `followers_count` (`followers_count`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

因此,当我在其表上执行它时,join并不会因工作良好而减慢查询和排序的速度。那么如何提高性能呢?

更新1

@GordonLinoff方法解决是否只需要父表的结果集。我想知道每人tweets的数量(与tracked_twitter表匹配的twitter_content的数量)。我该如何修改?如果我想在推文内容上使用数学函数,该怎么做?

SELECT  `tracked_twitter` . * , COUNT( * ) AS twitterContentCount, retweet_count + favourite_count + reply_count AS engagement
FROM  `tracked_twitter` 
INNER JOIN  `twitter_content` ON  `tracked_twitter`.`id` =  `twitter_content`.`tracked_twitter_id` 
INNER JOIN  `tracker_twitter_content` ON  `twitter_content`.`id` =  `tracker_twitter_content`.`twitter_content_id` 
WHERE  `is_influencer` !=  '1'
AND  `tracker_twitter_content`.`tracker_id` =  '88'
AND  `tracked_twitter_id` !=  '0'
GROUP BY  `tracked_twitter`.`id` 
ORDER BY twitterContentCount DESC 
LIMIT 20 
OFFSET 0

问题答案:

尝试摆脱distinct。那是性能杀手。我不确定为什么您的第一个查询会很快工作;也许MySQL足够聪明,可以对其进行优化。

我会尝试:

SELECT tt.id
FROM tracked_twitter tt
WHERE EXISTS (SELECT 1
              FROM twitter_content tc INNER JOIN  
                   tracker_twitter_content ttc
                   ON  tc.id =  ttc.twitter_content_id
              WHERE  ttc.tracker_id =  88 AND
                     tt.id =  tc.tracked_twitter_id
             )
ORDER BY tt.followers_count DESC ;

对于此版本,您想对指数: tracked_twitter(followers_count, id)twitter_content(tracked_twitter_id, id),和
tracker_twitter_content(twitter_content_id, tracker_id)



 类似资料:
  • 我正在编写spring批处理,它从平面文件中读取数据,很少进行处理,并将摘要写入输出文件。与reader相比,我的处理器和写入程序相对更快。我正在使用FlatFileItemReader,并尝试了从50-1000开始的各种提交间隔。我的批处理作业必须以更快的速度处理1000万条记录。请告诉我如何提高FlatFileItemReader的速度。粘贴到我的配置文件和映射器类下面,读取字段集并将值设置为

  • 我正在使用PhpStorm 2018.3.4,Docker,MySQL和Ubuntu。我试图配置MySQL与Docker容器不成功。 首先,我尝试了以下配置: 它给了我这个错误: 然后,我试了一下: 这个给了我另一个错误。 我错过什么了吗?有没有其他地方我必须配置一些东西? 输出: 这里: 对于命令,这里是描述的链接:https://pastebin.com/9LmeAkc8 下面是docker-

  • 问题内容: 以下是我用于通过电子邮件搜索人的查询 在“电子邮件”上添加索引会加快查询速度吗? 问题答案: 不可以,因为当您使用通配符时,MySQL将无法使用该索引。如果您将LIKE更改为’f%’,那么它将能够使用索引。

  • 我有一个名为Emails的列族,我正在将邮件保存到这个CF中,编写5000封邮件需要100秒。 我使用的是i3处理器,8gb内存。我的数据中心有6个节点,复制因子=2。 我们存储在卡桑德拉中的数据大小会影响性能吗?影响写入性能的所有因素是什么,如何提高性能? 预先感谢..

  • 问题内容: Python中最快的FFT实现是什么? 似乎numpy.fft和scipy.fftpack都基于fftpack,而不是FFTW。fftpack和FFTW一样快吗?使用多线程FFT或使用分布式(MPI)FFT怎么办? 问题答案: 当然,您可以使用Cython或其他具有类似想法的工具(可以访问外部库)包装要测试的任何FFT实现。 基于GPU 如果要测试FFT实现,则还可以查看基于GPU的代

  • 问题内容: 我在公司中多次设计数据库。为了提高数据库的性能,我只寻找标准化和索引。 如果要求您提高数据库的性能,该数据库包含大约250个表以及一些具有数百万个记录的表,那么您将寻找什么不同的东西? 提前致谢。 问题答案: 优化逻辑设计 逻辑级别是关于查询和表本身的结构。首先尝试最大程度地发挥这一作用。目标是在逻辑级别上访问尽可能少的数据。 拥有最高效的SQL查询 设计支持应用程序需求的逻辑架构(例