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。