2014-04-25 47 views
-2

我在數據庫表中有大約200,000行。當我執行我的搜索查詢時,需要大約4-5秒才能在下一頁給我結果。我希望執行速度快,結果應該在2秒內加載。我的桌子上有大約16列。如何在SQL中創建索引以提高性能

以下是我創造的表

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

使用兩個喜歡在您的查詢,據我所知,這不是[可轉位(http://dev.mysql.com/doc/refman/5.0/en/create-index.html)。我認爲你可以優化其中一項(這會提高你的表現)。此外,您可以嘗試在您的查詢上運行[解釋](https://dev.mysql.com/doc/refman/5.5/en/execution-plan-information.html)。 –

+0

你可以重新考慮你的WHERE子句:'其中name LIKE '%寶貝童車%%''或'其中name LIKE '%童車%寶貝%'' –

+0

@ MihaiBejenariu-的由你定的查詢將可轉位? – user3564442

回答

3

索引不會幫助。 LIKE是一個不可靠的運營商。 http://en.wikipedia.org/wiki/Sargable

+0

的意思是,如果我使用像在我的查詢然後索引不能在該query.is它? – user3564442

+1

等是非優化搜索,只有當它是與領先的通配符..更多是1%字符前字符更好的是使用索引.... –

+0

k.if我的寶寶和搖籃之前刪除%符號,並保持標誌%這些話後,查詢應該是indexable.is它? – user3564442

1

有一個很好的閱讀here

LIKE不使用全文索引。如果您想使用全文搜索,您可以使用MySQL全文搜索功能,您可以閱讀MySQL文檔。

下面是在MySQL中添加索引的語法:

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); 
+0

我應該如何創建一個索引,我將添加這個查詢 – user3564442

+0

請看我的編輯。 – jomsk1e

+0

k.do我只需要使用alter查詢或子查詢還@ jomsk1e – user3564442

1

用於開始匹配字符串的通配符運算符%呈現任何無用的索引。

第1個通配符運算符前的字符越多,索引查找掃描越快。

不管怎麼說,你甚至可以在NAME列上創建索引後添加一個索引到現有的表

ALTER TABLE feed ADD INDEX (NAME); 

這將不使用索引becuse它具有領先%字符

select * from feed where (name like '%Baby%' And NAME like '%Bassinet%') 

這將使用索引作爲起始%刪除

select * from feed where (name like 'Baby%' And NAME like 'Bassinet%') 
+0

與像或%號查詢cannt進行索引。???? – user3564442

+0

@ user3564442檢查編輯的答案.. –

+0

這意味着最後一個查詢,你在我的帖子中提到,將可索引,正確的? – user3564442

1

在你的情況下索引是不是有用的。當我們找到像運算符時,它不使用索引。當我們直接搜索即columnname ='Ajay'時,此時它在索引中搜索(如果適用)。原因是索引是用物理數據搜索的,而不是邏輯數據(對於像運算符)。

您可以使用全文搜索進行此操作,您只能在其中定義需要查找數據的列。如果您有更多的數據,FTS非常有用並且可以獲得更快的數據。

如何啓用FTS,請檢查鏈接。

http://blog.sqlauthority.com/2008/09/05/sql-server-creating-full-text-catalog-and-index/

+0

但是,如果我刪除%符號之前,像這樣的話,如果我把它保存爲嬰兒%,那麼索引應該work.ryt? – user3564442

+0

不,%表示通配符,所以我們得到從嬰兒開始的結果,但以「嬰兒」或「嬰兒氣球」或「baby123」結束。所以索引簡單搜索索引葉上的當前數據。正如我寫的,爲%microsoft推出FTS比like運算符更快。 – Ajay2707