为什么MySQL查询在第二次运行时更快?

时间:2016-11-22 15:03:29

标签: mysql database database-design

我有一个非常奇怪的问题来自我刚刚做出的观察,这实际上可以帮助我更好地理解我的数据库行为并更好地设计它。

首先,这是我们正在讨论的MySQL数据库。 User_ID字段有一个索引。

这是我运行的代码:

casper test check-add-to-cart.js

由于某些原因,我不知道当我为200名fisrt用户运行它时,然后停止它,每10个用户需要大约1秒,非常慢。

但是如果几分钟之后我为1000名第一位用户运行它,它会在不到一秒的时间内达到200,然后在此之后减速到10用户/秒的速度,如果我在那之后运行5000(非常快到1000,之后慢)。

问题:

  • 查询是否可以暂时存储在某个位置(在我的服务器的RAM中?)解释其速度?
  • 你认为有什么方法可以加快这个过程吗?

***** Edit1: 根据要求:

query3 =("SELECT Content FROM Twit " "WHERE User_ID = %s " "limit 25 ") for userid, c_word in user22_list: cursorSQL.execute(query3, (userid,))

的输出
SHOW CREATE TABLE Twit

输出 Table Create Table Twit CREATE TABLE `Twit` ( `ID_num` bigint(45) NOT NULL, `Content` varchar(250) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `User_ID` bigint(24) NOT NULL, `Location` varchar(70) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `Date_create` datetime NOT NULL, `Retweet_count` int(7) NOT NULL, `isRetweet` tinyint(1) NOT NULL, `hasReetweet` tinyint(1) NOT NULL, `Original` bigint(45) DEFAULT NULL, `Url` varchar(150) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `Favorite_count` int(7) NOT NULL, PRIMARY KEY (`ID_num`), KEY `User_ID` (`User_ID`), KEY `Date_create` (`Date_create`), KEY `User_ID_2` (`User_ID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

  • id = 1
  • select_type =' SIMPLE'
  • "表" =' Twit'
  • partitions = null
  • type =' ref'
  • possible_keys =' User_ID,User_ID_2'
  • "键" =' User_ID'
  • key_len =' 8'
  • ref =' const'
  • "行" = 298
  • 过滤= 100
  • 额外='使用索引条件';

变量:

  • EXPLAIN SELECT Content From...

为了更清楚我在python循环中调用SELECT请求。如果我已经为这个用户运行了SELECT请求,那么每次迭代都非常快,否则非常慢。是否擦拭RAM(服务器重启)无关紧要。

感谢。

1 个答案:

答案 0 :(得分:3)

有两个“缓存”可以解释时间“加速”。

  • InnoDB使用其“缓冲池”来避免从磁盘重新加载内容。
  • 如果启用了“查询缓存”,则第二次运行可以“立即”返回,因为QC会缓存结果集。

“之后减速到10用户/秒的速度” - 闻起来像数据尚未缓存。

如果没有LIMIT,请不要使用ORDER BY,除非您不关心回到哪一行。

什么是cursorSQL?不同的客户做不同的事情;了解您正在使用的语言可能很重要。

请提供SHOW CREATE TABLE TwitEXPLAIN SELECT ...,以便我们了解更多详情。

请通过“为1000名第一位用户运行”来解释您的意思。是1000选择?一个选择LIMIT 1000?还有别的吗?

你有多少内存? innodb_buffer_pool_size的价值是什么?