mysql - 连接多个表会使查询运行时间过长

标签 mysql sql

我有几个表,包含(a.o.)以下字段:

tweets:
--------------------------
tweet_id ticker created_at
--------------------------
1        1      1298063318
2        1      1298053197

stocks:
---------------------------------
ticker date        close volume
---------------------------------
1      1313013600  12.25 40370600
1      1312927200  11.60 37281300

wiki:
-----------------------
ticker date       views
-----------------------
1      1296514800   550
1      1296601200   504

我想汇总每天的推文数量、关闭、数量和浏览量(对于由 ticker = 1 标识的行)。推文表领先,这意味着如果某个日期没有推文,则当天的收盘价、交易量和浏览量都无关紧要。换句话说,我希望查询的输出类似于:

-------------------------------------
date        tweets close volume views
-------------------------------------
2011-02-13  4533   12.25 40370600 550
2011-02-14  6534   11.60 53543564 340
2011-02-16  5333   13.10 56464333 664

在此示例输出中,2011 年 2 月 15 日没有推文,因此不需要当天的其余数据。到目前为止,我的查询是:

SELECT 
  DATE_FORMAT(FROM_UNIXTIME(tweets.created_at), '%Y-%m-%d') AS date, 
  COUNT(tweets.tweet_id) AS tweets,
  stocks.close,
  stocks.volume,
  wiki.views
FROM tweets
LEFT JOIN stocks ON tweets.ticker = stocks.ticker
LEFT JOIN wiki ON tweets.ticker = wiki.ticker
WHERE tweets.ticker = 1
GROUP BY date
ORDER BY date ASC

有人可以验证这个查询是否正确吗?它不会遇到任何错误,但会卡住我的电脑。也许我应该在这里或那里设置一个索引,可能在“代码”列上?

[编辑]

根据要求,表定义:

CREATE TABLE `stocks` (
  `ticker` int(3) NOT NULL,
  `date` int(10) NOT NULL,
  `open` decimal(8,2) NOT NULL,
  `high` decimal(8,2) NOT NULL,
  `low` decimal(8,2) NOT NULL,
  `close` decimal(8,2) NOT NULL,
  `volume` int(8) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE `tweets` (
  `tweet_id` int(11) NOT NULL AUTO_INCREMENT,
  `ticker` varchar(5) NOT NULL,
  `id_str` varchar(18) NOT NULL,
  `created_at` int(10) NOT NULL,
  `from_user` int(11) NOT NULL,
  `text` text NOT NULL,
  PRIMARY KEY (`tweet_id`),
  KEY `id_str` (`id_str`),
  KEY `from_user` (`from_user`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1;

CREATE TABLE `wiki` (
  `ticker` int(3) NOT NULL,
  `date` int(11) NOT NULL,
  `views` int(6) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

希望对您有所帮助。

最佳答案

关于索引,您是对的,如果没有 ticker 上的索引,您将不得不在所有表中进行 where-search,如果它们很大,那将花费很多时间。

我建议你打开logging of all queries that run without index至少时不时地发现查询,如果不是已经很慢,那么当数据增加时会很慢。

使用 [EXPLAIN SELECT ...][2] 检查查询如果你发现它们很慢,学习如何解释结果(不容易但很重要)以了解在哪里放置新索引。

关于mysql - 连接多个表会使查询运行时间过长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8262089/

相关文章:

sql - 使用LIKE命令%pattern%从sqlite数据库获取数据,但'%'+ pattern'%'无效

mysql - sql如果不存在()插入不起作用

sql - SQL Server 2014 中仅分组后的不同值

mysql - 选择一个表中的所有项目,并检查另一个表中是否有对应的项目

mysql - 获取过去三年内发出请求的所有用户

javascript - NodeJs MYSQL 序列批量插入最佳实践

php - 作为输出的数据计数

sql - 避免在某些条件下返回结果集

php - 在php上查看数据时给出默认值

mysql - 在 SQL 查询中使用 else