对于简单类型查询,需要3.50秒的1000万行

时间:2017-01-01 14:47:11

标签: 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 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
)

请教我如何优化此查询。非常感谢你。

1 个答案:

答案 0 :(得分:5)

您需要在用于该查询的列上添加fscanf(),否则数据库必须检查表中的所有行,以查看哪个行适合您的INDEX子句。< / p>

WHERE

ALTER TABLE mo ADD INDEX (created_at); 使MySQL能够根据您在该列中的数据仅扫描部分表格。

您可以阅读有关how mysql uses indexes的更多信息。

关于查询本身 - 在不更改表格结构的情况下,您无法真正优化它(除非您知道哪个index符合ids并且您可以更改查询以使用{{ 1}},因为表格中的WHERE列已被编入索引,但我想情况并非如此。“