为什么第二次运行 MySQL 查询速度更快?

yln*_*nor 5 mysql database database-design

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

首先,我们所说的这是一个MySQL数据库。User_ID 字段有一个索引。

这是我运行的代码:

query3 =("SELECT Content FROM Twit "
          "WHERE User_ID = %s "
          "limit 25 ")

for userid, c_word in user22_list:
    cursorSQL.execute(query3, (userid,))
Run Code Online (Sandbox Code Playgroud)

出于某种原因,我不明白,例如,当我为 200 个第一个用户运行它,然后停止它时,每 10 个用户大约需要 1 秒,非常慢。

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

问题:

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

***** 编辑1:根据要求:

的输出 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
Run Code Online (Sandbox Code Playgroud)

的输出 EXPLAIN SELECT Content From...

  • 编号=1
  • 选择类型 = '简单'
  • “表”=“推特”
  • 分区=空
  • 类型 = '参考'
  • possible_keys = '用户 ID,用户 ID_2'
  • “密钥”=“用户 ID”
  • key_len = '8'
  • 参考 = '常量'
  • “行”= 298
  • 过滤 = 100
  • Extra = '使用索引条件';

变量:

  • 'innodb_buffer_pool_size', Value = '4294967296';

为了更清楚地说明,我在 python 循环中调用 SELECT 请求。如果我已经为该用户运行了 SELECT 请求,则每次迭代都会非常快,否则会非常慢。RAM 是否已被擦除(服务器重新启动)并不重要。

谢谢。

Ric*_*mes 4

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

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

“然后减慢到 10 个用户/秒的速度”——听起来数据还没有被缓存。

不要使用LIMIT没有 an 的a ORDER BY,除非您不关心返回哪些行。

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

请提供SHOW CREATE TABLE TwitEXPLAIN SELECT ...以便我们了解更多详细信息。

请解释一下“为第 1000 个第一个用户运行它”是什么意思。是1000个选择吗?LIMIT 1000 的一项选择?还有别的事吗?

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