我是数据库查询优化的新手。 这是创建表查询:
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
)
请教我如何优化此查询。非常感谢你。
答案 0 :(得分:5)
您需要在用于该查询的列上添加fscanf()
,否则数据库必须检查表中的所有行,以查看哪个行适合您的INDEX
子句。< / p>
WHERE
ALTER TABLE mo ADD INDEX (created_at);
使MySQL能够根据您在该列中的数据仅扫描部分表格。
您可以阅读有关how mysql uses indexes的更多信息。
关于查询本身 - 在不更改表格结构的情况下,您无法真正优化它(除非您知道哪个index
符合ids
并且您可以更改查询以使用{{ 1}},因为表格中的WHERE
列已被编入索引,但我想情况并非如此。“