2014-01-15 28 views
0

表結構:如何來確定正確的索引MySQL表

Column Type Null Default 
id bigint(20) No 
title varchar(255) Yes NULL 
category_id int(11) Yes NULL 
street varchar(255) Yes NULL 
city varchar(255) Yes NULL 
state_code varchar(255) Yes NULL 
zip varchar(11) Yes NULL 
phone varchar(255) Yes NULL 
website varchar(255) Yes NULL 
rating varchar(5) Yes NULL 
hours text Yes NULL 
country varchar(255) Yes NULL 
tags text Yes NULL 
email varchar(255) No 
Address varchar(255) Yes NULL 
SecondaryPhone varchar(255) Yes NULL 
ProductsServices text Yes NULL 
Specialties text Yes NULL 
BrandsCarried text Yes NULL 
PaymentMethods text Yes NULL 
edit_title varchar(255) Yes NULL 
subcategory_id int(11) Yes NULL 
edit_street varchar(255) Yes NULL 
edit_city varchar(255) Yes NULL 
state varchar(255) Yes NULL 
edit_state_code varchar(255) Yes NULL 
edit_country varchar(255) Yes NULL 
edit_phone varchar(255) Yes NULL 
your varchar(255) Yes NULL 
edit_hours varchar(255) Yes NULL 
edit_email varchar(255) Yes NULL 
image varchar(255) Yes NULL 
banner varchar(255) Yes NULL 
alias_name varchar(255) Yes NULL 
user_id int(11) Yes NULL 
about_us text Yes NULL 
status varchar(1) Yes 0 
featured varchar(1) Yes 0 
views int(11) Yes 0 
your_name varchar(255) Yes NULL 
your_email varchar(255) Yes NULL 
contact_no varchar(255) Yes NULL 
time_to_contact varchar(255) Yes NULL 
request_sent varchar(255) Yes NULL 
edit_website varchar(255) Yes NULL 
edit_tagline varchar(255) Yes NULL 
tagline varchar(255) Yes NULL 
edit_tags varchar(255) Yes NULL 
national_level varchar(1) Yes 0 
edit_about_us text Yes NULL 
about_us_status varchar(1) Yes 0 
plan_status varchar(1) Yes 1 
served_city varchar(255) Yes NULL 
created datetime Yes NULL 
modified datetime Yes NULL 

SQL查詢:

EXPLAIN SELECT `Business`.`id`, `Business`.`alias_name`, `Business`.`title`, 
    `Business`.`city`, `Business`.`state_code`, `Business`.`image`, `Business`.`about_us`, 
    `Business`.`tagline`, `Business`.`phone`, `Business`.`website`, `Business`.`email` 
FROM `fp_businesses_jtest1` AS `Business` 
WHERE ((((`Business`.`title` LIKE '%Flower Cottage of Landrum%') OR (`Business`.`tagline` LIKE '%Flower Cottage of Landrum%') OR (MATCH (`Business`.`tags`) AGAINST ("Flower Cottage of Landrum" IN BOOLEAN MODE)))) AND (((FIND_IN_SET('Scarborough',`Business`.`served_city`)) OR (`Business`.`city` LIKE 'Scarborough%')))) 
ORDER BY `Business`.`modified` DESC; 

結果

id select_type  table type possible_keys key  key_len  ref  rows Extra 
1 SIMPLE  Business ALL  fusedindex1  NULL NULL  NULL 0  Using where; Using filesort 

新的SQL查詢:我已刪除從where子句中類似並添加全部在matach &針對列。

 SELECT `Business`.`id`, `Business`.`alias_name`, `Business`.`title`, Business`.`city`, `Business`.`state_code`, `Business`.`image`, `Business`.`about_us`, Business`.`tagline`, `Business`.`phone`, `Business`.`website`, `Business`.`email` FROM `fp_businesses_jtest1` AS `Business` WHERE (MATCH `Business`.`tags`,`Business`.`title`,`Business`.`tagline`) AGAINST ("Flower Cottage of Landrum" IN BOOLEAN MODE)) AND (MATCH (`Business`.`served_city`,`Business`.`city`) AGAINST("Scarborough" IN BOOLEAN MODE)) ORDER BY `Business`.`modified` DESC 

任何人都可以請諮詢我如何識別索引和優化表。

+1

用於索引的一般經驗法則:涉及「join」,「where」或「order by」的任何字段都應該有一個索引。 –

回答

1

您正在使用全文字符串搜索,這是不可能的(至少對於MySQL)使用「經典」索引。

您可以嘗試使用FULLTEXT INDEX如圖here,你可以看看mysql full text search tuning但我一直結束了使用預先計算的索引表或系統,如Sphinx

1

您的表結構和查詢很難優化。

OR的使用意味着查詢必須評估where子句中的每一個比較。

您的一些比較在字符串比較開始時使用通配符(Business . title` LIKE'%Flower Cottage of Landrum%')。查詢引擎在這種情況下不能使用索引;正如Vyktor寫道,你可能會更好地使用全文搜索。

不確定FIND_IN_SET如何與索引行爲 - this問題表明它會導致表掃描。

長而短 - 我認爲你可以通過添加索引來做些什麼。

我會使用全文搜索查詢的第一部分,我會將serve_city字段拆分爲多對多連接。