表格结构:
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子句中删除了like,并在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
任何人都可以请教我如何识别索引和优化表。
答案 0 :(得分:1)
您正在使用全文字符串搜索,这是不可能的(至少对于mysql)使用“经典”索引。
您可以尝试使用FULLTEXT INDEX
,如here所示,您可以查看mysql full text search tuning但我总是使用预先计算的索引表或系统{{3} }。
答案 1 :(得分:1)
您的表格结构和查询很难优化。
OR的使用意味着查询必须评估where子句中的每个比较。
您的一些比较在字符串比较开始时使用外卡(Business .
title` LIKE'%Flower Cottage of Landrum%')。在这种情况下,查询引擎无法使用索引;正如Vyktor所写,你可能更善于使用全文搜索。
不确定FIND_IN_SET如何使用索引进行操作 - this问题表明它会导致表扫描。
长短 - 我认为通过添加索引几乎无法做到。
我会对查询的第一部分使用全文搜索,然后将serving_city字段拆分为多对多连接。