我正在基于从jquery自动完成函数发送的类型化数据对mysql数据库进行查询。它工作正常但需要几秒钟(5-6 +)才能获得返回的建议。目前,数据库中有大约200,000个产品条目,预计将有超过一百万个条目。我怎样才能加速这件事,因为一旦添加了更多的条目,就可以说在某人已经输入完整的搜索查询之前,结果可能永远不会显示,这根本不会使他们受益。
MySQL表是:
CREATE TABLE `products` (
`id` int(12) NOT NULL auto_increment,
`name` varchar(255) NOT NULL default '',
`description` text NOT NULL,
`category` int(12) NOT NULL default '0',
PRIMARY KEY (`id`),
KEY `name` (`name`),
KEY `category` (`category`)
) ENGINE=MyISAM;
CREATE TABLE `products_pics` (
`id` int(12) NOT NULL auto_increment,
`product_id` int(12) NOT NULL default '0',
`thumb` blob NOT NULL,
`image` longblob NOT NULL,
`type` varchar(6) NOT NULL default '',
PRIMARY KEY (`id`),
KEY `product_id` (`product_id`),
) ENGINE=MyISAM;
搜索和结果返回的PHP代码是:
if(isset($_REQUEST['queryString'])) {
$queryString = addslashes($_REQUEST['queryString']);
if(strlen($queryString) > 0) {
$result = mysql_query("SELECT * FROM products WHERE name LIKE '%" . $queryString . "%' ORDER BY name LIMIT 8", $db);
if(mysql_num_rows($result) > 0){
while($myrow = mysql_fetch_array($result)){
$query = mysql_query("SELECT id FROM products_pics WHERE product_id='$myrow[id]' LIMIT 1", $db);
if(mysql_num_rows($query) > 0){
echo '<a href=""><img src="/ajax/search_images.php?id=' . $myrow[id] . '" width="55" border="0" alt="" />';
}
else {
echo '<a href=""><img src="/images/items/no-img.jpg" width="55" border="0" alt="" />';
}
$name = stripslashes($myrow[name]);
if(strlen($name) > 35) {
$name = substr($name, 0, 35) . "...";
}
echo '<span class="searchheading">' . $name . '</span>';
$description = stripslashes($myrow[description]);
if(strlen($description) > 80) {
$description = substr($description, 0, 80) . "...";
}
echo '<span>' . $description . '</span></a>';
}
echo '<span class="seperator"></span>';
}
}
}
再次感谢大家,感谢任何帮助。
答案 0 :(得分:3)
执行LIKE %keyword%
非常慢。由于您正在执行自动填充功能,因此可以放弃第一个%
,执行:LIKE keyword%
。
这将大大加快您的查询速度。
此外,尝试在MYSQL中执行您的查询,例如'EXPLAIN&lt;&gt;'。这将为您提供有关MySQL如何执行查询以及可能优化的位置的信息。
另一种选择可能是使用MyISAM的全文本搜索功能:http://dev.mysql.com/doc/refman/5.1/en/fulltext-search.html