有关此索引的建议和改进

时间:2014-06-04 06:43:11

标签: mysql sql performance query-optimization

简短说明:我的议程约有100.000个联系人。 我有一个高级搜索,让我可以通过以下方式搜索联系人:姓名,城市,标签(与他们的城镇相关的一些标签,例如:一个来自新人的人将获得NYDude),教师和我正在使用一些复选框来过滤他们的性别。

现在,有了100.000个联系人,我的搜索速度有点太慢,所以我决定尝试一些索引。请记住,我没有很好的索引经验,你的意见真的会帮助我。所以:

$data = mysql_query("SELECT * FROM contacts
        WHERE  (owner = '$user' AND 
               `city` LIKE '".$search."%' 
                OR `name` LIKE '".$search."%'
                OR `tag` LIKE '".$search."%'
                OR `faculty` LIKE '".$search."%')".$gender)  

$search是从搜索框传来的字词。   owner是登录的人。从我的角度来看,这应该是要检查的第一个元素。如果我错了,请纠正我。

我的索引如下:

CREATE INDEX index_test ON contacts(owner, city, name, tag, faculty);

您如何看待以及如何建议我改进它?

我知道在索引上,索引列的顺序非常重要,但请记住,我的搜索不遵循任何订单规则(用户可以按任意顺序搜索城镇,名称,教职员工),我可以控制不了。

2 个答案:

答案 0 :(得分:3)

您可以使用全文索引:

CREATE INDEX index_test1 ON contacte(owner);

CREATE FULLTEXT INDEX index_test_all ON contacte(city,name,tag,faculty);

您的查询:

$data = mysql_query("SELECT * FROM contacts
    WHERE  (owner = '$user') AND 
           MATCH (`city`,`name`,`tag`, `faculty`) AGAINST ('".$search."')");  

阅读有关MySQL 5.6中全文索引的更多信息: http://dev.mysql.com/doc/refman/5.6/en/fulltext-search.html

答案 1 :(得分:1)

所有这些OR - 他们真的有必要吗?因为没有索引可以帮助你解决这个问题:

CREATE INDEX index_contact_owner ON contacts(owner);

这将加速检索用户拥有的所有联系人,这是查询中唯一不变的术语。然后,数据库可以按名称,城市或具有实际值的任何搜索条件过滤结果集。

为什么没有其他索引帮助?因为OR条款意味着您必须搜索所有CITY,所有TAG,所有NAME等。如果您在CITY上进行攻击,复合索引不会帮助您进行TAG。多个单独的索引不会有帮助,因为数据库只能使用其中一个。阅读整个表格将是一个更有效的选择。


请记住,性能调整是良好实践和实验的结合。每种情况都不同。事情将根据数据量和偏差而变化:有多少业主?联系方式?用户多久指定一次城市?等等。因此,虽然我们可以为您提供建议,但您确实需要尝试不同的方法,看看哪种方法最适合您。