如何确定mysql表的正确索引

时间:2014-01-15 15:04:50

标签: 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子句中删除了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 

任何人都可以请教我如何识别索引和优化表。

2 个答案:

答案 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字段拆分为多对多连接。