Mysql 一个简单的类型查询需要1000万行,耗时3.50秒
我不熟悉数据库查询优化。 以下是创建表查询:Mysql 一个简单的类型查询需要1000万行,耗时3.50秒,mysql,query-optimization,Mysql,Query Optimization,我不熟悉数据库查询优化。 以下是创建表查询: CREATE TABLE mo ( id int UNSIGNED NOT NULL auto_increment, msisdn varchar(20) NOT NULL, operatorid int UNSIGNED NOT NULL, shortcodeid int UNSIGNED NOT NULL, text varchar(100) NOT NULL, auth_token varchar(60) NOT NUL
CREATE TABLE mo (
id int UNSIGNED NOT NULL auto_increment,
msisdn varchar(20) NOT NULL,
operatorid int UNSIGNED NOT NULL,
shortcodeid int UNSIGNED NOT NULL,
text varchar(100) NOT NULL,
auth_token varchar(60) NOT NULL,
created_at DATETIME,
PRIMARY KEY(id)
);
我的问题是:
SELECT count(id) as mo_count from mo where created_at > DATE_SUB(NOW(), INTERVAL 15 MINUTE)
当我测试它时,结果是
Time taken for tests: 3.50 seconds
[0] => Array
(
[id] => 1
[select_type] => SIMPLE
[table] => mo
[type] => ALL
[possible_keys] =>
[key] =>
[key_len] =>
[ref] =>
[rows] => 10000255
[Extra] => Using where
)
请教我如何优化此查询。非常感谢。您需要在用于该查询的列上添加一个
索引,否则数据库将必须检查表中的所有行,以查看哪一行适合您的WHERE
子句
ALTER TABLE mo ADD INDEX (created_at);
索引使MySQL能够根据该列中的数据,只扫描表的一部分
你可以阅读更多关于
关于查询本身-如果不更改表的结构,您就无法真正优化它(除非您知道哪个id
适合WHERE
,并且您可以将查询更改为使用id>X
,因为表中的id
列已被索引,但我猜情况并非如此).他问如何优化查询,而不是模型:-)我是在开玩笑。您的解决方案是最明显的;)不,不,你是对的!我真的认为解释这一部分也很重要:)你可以检查更新。考虑到他们拥有的记录数量,我认为这不是很糟糕,但可以经受一些优化,正如在“相关”下的问答中所讨论的。Dekel的回答基本上回答了这个问题。非常感谢@Dekel。你的解释很有帮助。顺便说一句,新年快乐!:)如果此表继续增长,并且您经常查询计数,您可能会对新设计感兴趣。例如,您可以将最后的记录保存在一个非常小的“始终保持新鲜”表中。同时,将有一个包含所有记录的“历史”表。您还可以按照一定的时间段(天?)对表进行调整和分区,这样可以限制每个计数查询的IO。