2012-02-29 151 views
1

我有一个数据库与大量的广告张贴。它在大小很小时工作正常,但现在托管公司经常暂停我的帐户,因为我的数据库有超过10万行。他们告诉我,我的查询对我的桌子来说效率不高。所以,我做了一些在线搜索,并找到索引可能是一种解决我的查询问题的方法。MySQL查询优化器与索引

这里查询我的网站

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

的$美食将在类别访客选择改变的基础。我正在使用phpmyadmin,并且我想知道索引如何与上面的查询一起工作。我创建了cate列的索引,但不知道如何使用创建的索引来优化查询。

这里是我如何使用

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

添加索引

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

我得到了这样的事情:

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 

在此先感谢。

+0

当您选择*时,索引将帮助的唯一方法是如果索引位于表中的每个列上。但是如果你这样做了,我敢肯定你的主机不会那么喜欢......你需要缩小你选择的语句的范围,只包含你需要的那些字段。编辑您的问题以仅包含您需要的那些列,并且有人可以帮助您创建适当的索引。 – gangreen 2012-02-29 06:18:03

+1

为什么你需要LIMIT 2000?当然你可以做更少的行吗?我无法想象你会在一个页面上投放2000个广告:) – Daan 2012-02-29 07:21:02

回答

2

如果按cate column您的意思是keytype column,那么您的索引已被使用。你有没有注意到查询有什么改进?要检查是否该指数是真正被在该查询,您可以运行下面的查询使用:

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

您可以发表你如何创建的索引和查询的结果提供更多的信息。

+0

我只是在列名旁边使用“照明”符号,全部在phpmyadmin中完成。这是正确的事情吗? – 2012-02-29 06:42:59

+0

对phpmyadmin不太了解,但只是在任何mysql客户端运行一个合适的类别的前一个查询,并应该返回一个不错的表格:) – 2012-02-29 06:45:15

+0

嗨,Mosty,我编辑了我的问题,请让我知道如果索引已经加入??使用查询时,我不会遇到任何速度增加。有什么我可以做,看看查询是否真的有效? – 2012-02-29 16:41:05

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

  2. 如果您可以将2000限制降低到更明智的程度,如果你真的不需要2000行,请降低该值。

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