具有索引的MySQL查询优化器

时间:2012-02-29 06:11:05

标签: php mysql phpmyadmin

我有一个包含大量广告帖子的数据库。当尺寸很小时,它工作正常,但现在托管公司经常暂停我的帐户,因为我的数据库有超过100,000行。他们告诉我,我的查询对我的桌子不再那么有效了。所以,我在网上进行了一些搜索,找到索引可能是解决我的查询问题的一种方法。

这是查询我的网站

$sql = "SELECT * 
        FROM `adstable` 
        WHERE `keytype` = '".$cate."' 
        ORDER BY `adstable`.`id` DESC 
        LIMIT 2000";

$ cate将根据访客选择的类别进行更改。我正在使用phpmyadmin,我想知道索引如何与上面的查询一起使用。我已经为cate列创建了索引,但是不知道如何使用我创建的索引来优化查询。

这是我如何添加索引

ALTER TABLE  `adstable` ADD INDEX (  `keytype` )

使用

EXPLAIN 
SELECT * 
FROM `adstable`
WHERE `keytype` = '".$cate."'
ORDER BY `adstable`.`id` DESC
LIMIT 2000

我有这样的事情:

id | select_type | table  | type | possible_keys | key     | key_len | ref | rows | Extra
1  | SIMPLE  |adstable| ref  | keytype       | keytype |   38    |const|49392 | Using where; Using filesort
提前谢谢。

2 个答案:

答案 0 :(得分:2)

如果cate column表示keytype column,那么您的索引已被使用。您是否注意到查询有任何改进?要检查索引是否确实在该查询中使用,您可以运行以下查询:

EXPLAIN SELECT * FROM `adstable`
WHERE `keytype` = '".$cate."'
ORDER BY `adstable`.`id` DESC
LIMIT 2000

您可以发布创建索引的方式以及该查询的结果,以提供更多信息。

答案 1 :(得分:1)

  1. 是MyISAM表吗?如果是,请添加(keytype, id)索引。

  2. 如果您可以将2000限制降低到更合理的范围,例如如果你真的不需要2000行,那就降低这个值。

  3. 您真的需要SELECT列表中的所有列吗?如果没有,请删除*并仅记下您需要的那些列。