我有一个非常奇怪的问题来自我刚刚做出的观察,这实际上可以帮助我更好地理解我的数据库行为并更好地设计它。
首先,这是我们正在讨论的MySQL数据库。 User_ID字段有一个索引。
这是我运行的代码:
casper test check-add-to-cart.js
由于某些原因,我不知道当我为200名fisrt用户运行它时,然后停止它,每10个用户需要大约1秒,非常慢。
但是如果几分钟之后我为1000名第一位用户运行它,它会在不到一秒的时间内达到200,然后在此之后减速到10用户/秒的速度,如果我在那之后运行5000(非常快到1000,之后慢)。
问题:
***** 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
变量:
EXPLAIN SELECT Content From...
为了更清楚我在python循环中调用SELECT请求。如果我已经为这个用户运行了SELECT请求,那么每次迭代都非常快,否则非常慢。是否擦拭RAM(服务器重启)无关紧要。
感谢。
答案 0 :(得分:3)
有两个“缓存”可以解释时间“加速”。
“之后减速到10用户/秒的速度” - 闻起来像数据尚未缓存。
如果没有LIMIT
,请不要使用ORDER BY
,除非您不关心回到哪一行。
什么是cursorSQL
?不同的客户做不同的事情;了解您正在使用的语言可能很重要。
请提供SHOW CREATE TABLE Twit
和EXPLAIN SELECT ...
,以便我们了解更多详情。
请通过“为1000名第一位用户运行”来解释您的意思。是1000选择?一个选择LIMIT 1000?还有别的吗?
你有多少内存? innodb_buffer_pool_size
的价值是什么?