MySQL有效地搜索多个列(很多行)

时间:2014-06-16 14:20:02

标签: mysql database

您好,正在处理内部IP地址分配数据库。我知道有开源选项,但我想从头开始制作自己的选项。我想知道我搜索的方式是否是最佳方式,因为将有10000条记录可供搜索。

表结构如下:

+-------------+------------------------------+------------------+---------------------+----------------+
| ipaddress   | rdns                         | comment          | modified            | rangeaddress   |
+-------------+------------------------------+------------------+---------------------+----------------+
| 192.168.13.37 | something.internal.doman | Networks NAT | 2014-06-16 14:52:29 | 192.168.13.0/24

用户互动是通过使用PHP的网络前端,通过IP,范围,DNS或评论进行搜索,如下所示。

表格抓取搜索查询并以$q传递给PHP脚本。爆炸作为一个数组,jiggery pokery,以便它可以用作" LIKE OR"循环并将编辑后的数组内爆为$searchterms

示例:

$q = "test search term"
$searchterms = "%test% OR comment LIKE %search% OR comment LIKE %term%"

最终搜索查询是:

SELECT * FROM ips WHERE ipaddress LIKE '%" . $q . "%' OR rdns LIKE '%" . $q . "%' OR comment LIKE '" . $searchterms . "' OR rangeaddress LIKE '%" . $q . "%';"

这是搜索这么多列的最佳方式,还是有更好的方法?

谢谢,

奥利弗

1 个答案:

答案 0 :(得分:0)

1)避免在条件适用的地方使用'like'子句。这样,db只能扫描所有记录,而不是扫描索引。

2)为了在不失去灵活性的情况下提高性能,您可以分割可能出现在where子句中的字段。 以'ipaddress'为例,存储四个独立的部分而不是一个字符串。然后,解析并转换用户的查询字符串。

如果有人想查询“192.168。*”,最终条件应该是'part1 = 192 and part2 = 168';

如果有人想查询“192.16 *”,最终条件应该是'part1 = 192,part2在16到169之间'。

解析算法越复杂,您就可以提供更大的灵活性。