有关此索引的建议和改进

问题描述 投票:0回答:2

简短说明:我的议程约有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);

您怎么看?您如何建议我改进它?

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

mysql sql performance query-optimization
2个回答
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
投票

所有那些ORs - 他们真的有必要吗?因为除了这个之外没有索引可以帮助你查询:

CREATE INDEX index_contact_owner ON contacts(owner);

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

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


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

© www.soinside.com 2019 - 2024. All rights reserved.