我在数据库表中有大约200,000行。当我执行我的搜索查询时,大约需要4-5秒才能在下一页给我结果。我希望执行速度快,结果应该在2秒内加载。我的桌子上有大约16列。
以下是我创建表格的查询
Create table xml(
PID int not null,
Percentdisc int not null,
name varchar(100) not null,
brand varchar(30) not null,
store varchar(30) not null,
price int not null,
category varchar(20) not null,
url1 varchar(300) not null,
emavail varchar(100) not null,
dtime varchar(100) not null,
stock varchar(30) not null,
description varchar(200) not null,
avail varchar(20) not null,
tags varchar(30) not null,
dprice int not null,
url2 varchar(300),
url3 varchar(300),
sid int primary key auto_increment);
选择我正在使用的查询
select * from feed where (name like '%Baby%' And NAME like '%Bassinet%')
我对索引数据库知之甚少,以提高性能。请指导我使用什么索引。
答案 0 :(得分:3)
索引不会有帮助。 LIKE是一个非sargable运算符。 http://en.wikipedia.org/wiki/Sargable
答案 1 :(得分:1)
阅读得很好here。
LIKE不使用全文索引。如果您想使用全文搜索,可以使用MySQL全文搜索功能,您可以阅读MySQL doc。
以下是在MySQL中添加INDEX的语法:
ALTER TABLE `feed`
ADD INDEX (`Name`);
MySQL匹配示例:
子串匹配:(匹配:巴比伦,Bassineete等)
SELECT * FROM `feed` WHERE MATCH (NAME) AGAINST ("+Baby* +Bassinett*" IN BOOLEAN MODE);
完全匹配:
SELECT * FROM `feed` WHERE MATCH (NAME) AGAINST ("+Baby +Bassinett" IN BOOLEAN MODE);
答案 2 :(得分:1)
用于开始匹配字符串的通配符opeartor %
会使任何创建的索引无效。
第一个通配符运算符之前的字符越多,索引查找扫描就越快。
无论如何,您可以向现有表格添加索引
ALTER TABLE feed ADD INDEX (NAME);
即使在NAME列上创建索引,它也没有索引用法,因为它有一个前导%字符
select * from feed where (name like '%Baby%' And NAME like '%Bassinet%')
这将使用索引作为开始%删除
select * from feed where (name like 'Baby%' And NAME like 'Bassinet%')
答案 3 :(得分:1)
在你的情况下索引没用。当我们找到like运算符时它不使用索引。当我们直接搜索时,即columnname =' Ajay',此时它会搜索索引(如果适用)。原因是索引使用物理数据进行搜索,而不是使用逻辑数据进行搜索(对于类似运算符)。
您可以使用全文搜索,只能定义需要查找数据的列。当您拥有更多数据时,FTS非常有用并且可以获得更快的数据。
如何启用FTS,请检查链接。
http://blog.sqlauthority.com/2008/09/05/sql-server-creating-full-text-catalog-and-index/