我试图运行一个或多或少的简单查询约100000条目(大小:2319.58MB;平均:24KB预行)的MySQL表上。MySQL性能问题与简单的查询
这是查询:
SELECT
n0_.id AS id0,
n0_.sentTime AS sentTime1,
n0_.deliveredTime AS deliveredTime2,
n0_.queuedTime AS queuedTime3,
n0_.message AS message4,
n0_.failReason AS failReason5,
n0_.targetNumber AS targetNumber6,
n0_.sid AS sid7,
n0_.targetNumber AS targetNumber8,
n0_.sid AS sid9,
n0_.subject AS subject10,
n0_.targetAddress AS targetAddress11,
n0_.priority AS priority12,
n0_.targetUrl AS targetUrl13,
n0_.discr AS discr14,
n0_.notification_state_id AS notification_state_id15,
n0_.user_id AS user_id16
FROM
notifications n0_
INNER JOIN notification_states n1_ ON n0_.notification_state_id = n1_.id
WHERE
n0_.discr IN (
'twilioCallNotification', 'twilioSMSNotification',
'emailNotification', 'httpNotification'
)
ORDER BY
n0_.id desc
LIMIT
25 OFFSET 0
100和200sec之间的查询。
这是创建表的语句:
CREATE TABLE notifications (
id INT AUTO_INCREMENT NOT NULL,
notification_state_id INT DEFAULT NULL,
user_id INT DEFAULT NULL,
sentTime DATETIME DEFAULT NULL,
deliveredTime DATETIME DEFAULT NULL,
queuedTime DATETIME NOT NULL,
message LONGTEXT NOT NULL,
failReason LONGTEXT DEFAULT NULL,
discr VARCHAR(255) NOT NULL,
targetNumber VARCHAR(1024) DEFAULT NULL,
sid VARCHAR(34) DEFAULT NULL,
subject VARCHAR(1024) DEFAULT NULL,
targetAddress VARCHAR(1024) DEFAULT NULL,
priority INT DEFAULT NULL,
targetUrl VARCHAR(1024) DEFAULT NULL,
INDEX IDX_6000B0D350C80464 (notification_state_id),
INDEX IDX_6000B0D3A76ED395 (user_id),
PRIMARY KEY (id)
) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE=InnoDB;
ALTER TABLE notifications ADD CONSTRAINT FK_6000B0D350C80464 FOREIGN KEY (notification_state_id) REFERENCES notification_states (id) ON DELETE CASCADE;
ALTER TABLE notifications ADD CONSTRAINT FK_6000B0D3A76ED395 FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE;
这些查询由Doctrine2(ORM)创建的。我们在运行Debian 6.0.7的虚拟机(1GB RAM,单核)上使用MySQL 5.5.31。为什么查询的性能如此糟糕?这是数据库设计错误吗?还是仅仅为了处理这些数据量而使用vbox?
好点!我已经为** discr **列添加了一个索引。 '创建索引discr_idx ON通知(discr)'。查询运行时间不在0.1 - 0.5秒 – Frido
每次向查询添加一个子句时,如果你的表是一个大的表(即使是小表),不要忘记索引这个列,否则MySQL将消耗大量的RAM,时间。但对于您的数据库模式,最好为您的“discr”(只有“discr_id”和“discr_label”列)属性创建一个参考表,然后在“notifications”表中添加一个外键(discr_id)。性能会增加很多,因为索引是整数而不是字符。 – kmas