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 之前快,之后慢)。
问题:
***** 编辑1:根据要求:
的输出 SHOW CREATE TABLE Twit
Run Code Online (Sandbox Code Playgroud)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
的输出 EXPLAIN SELECT Content From...
变量:
'innodb_buffer_pool_size', Value = '4294967296';为了更清楚地说明,我在 python 循环中调用 SELECT 请求。如果我已经为该用户运行了 SELECT 请求,则每次迭代都会非常快,否则会非常慢。RAM 是否已被擦除(服务器重新启动)并不重要。
谢谢。
有两个“缓存”可以解释时序“加速”。
“然后减慢到 10 个用户/秒的速度”——听起来数据还没有被缓存。
不要使用LIMIT没有 an 的a ORDER BY,除非您不关心返回哪些行。
什么是cursorSQL?不同的客户做事的方式不同;了解您使用的语言可能很重要。
请提供SHOW CREATE TABLE Twit,EXPLAIN SELECT ...以便我们了解更多详细信息。
请解释一下“为第 1000 个第一个用户运行它”是什么意思。是1000个选择吗?LIMIT 1000 的一项选择?还有别的事吗?
你有多少内存?的价值是什么innodb_buffer_pool_size?