我有一个很大的mysql数据库(计划大约有一百万个条目),我想通过创建一个最差的查询(最长的计算时间)来测试它的性能。
现在它是一个包含两个表的数据库:
CREATE TABLE user (ID BIGINT NOT NULL AUTO_INCREMENT,
createdAt DATETIME NULL DEFAULT NULL,
lastAction DATETIME NULL DEFAULT NULL,
ip TEXT NULL DEFAULT NULL,
browser TEXT NULL DEFAULT NULL,
PRIMARY KEY (ID))
CREATE TABLE evt (ID BIGINT AUTO_INCREMENT,
UID BIGINT NULL DEFAULT NULL,
timeStamp DATETIME NULL DEFAULT NULL,
name TEXT NULL DEFAULT NULL,
PRIMARY KEY (ID),
FOREIGN KEY (UID)
REFERENCES user(ID))
它已填充并在本地运行,因此无需连接
是否有关于如何创建可怕查询的拇指规则?
我现在最糟糕的疑问是:
SELECT user.browser, evt.name, count(*) as AmountOfActions
FROM evt
JOIN user ON evt.UID = user.ID
GROUP BY user.browser, evt.name
ORDER BY AmountOfActions DESC
答案 0 :(得分:2)
查询中的首要成本是磁盘命中率。因此,创建一个足够大的表,以便它不能缓存在RAM中。和/或进行交叉连接(等),使得中间表太大而无法缓存在RAM中。
这个论坛上的一个常见问题是很多联接,然后是一个分组。或许多连接,加上大中间结果的顺序。
这是一个双重打击 - 在UUID上加入两个表(每个表都太大而无法缓存)。