我正在编写一个PDO准备,但我想知道是否有另一种好的方法来编写它以便它运行得更快。 这是代码:
function comp_post_code($cat, $comp_post_code){
global $DBH;
$STH = $DBH->prepare("SELECT * from uk_data where
cat10 like :comp_post_code AND (
cat1 like :cat OR
cat2 like :cat OR
cat3 like :cat OR
cat4 like :cat OR
cat5 like :cat OR
cat6 like :cat OR
cat7 like :cat
)") ;
$STH->bindValue(':cat', "%$cat%", PDO::PARAM_STR);
$STH->bindValue(':comp_post_code', "$comp_post_code%", PDO::PARAM_STR);
$STH->execute();
$STH->setFetchMode(PDO::FETCH_ASSOC);
return $STH;
$DBH = Null;
}
我想从表中获取完整数据,因此我使用Select。 * .... Thx
编辑: - cat10是邮政编码,cat 1到cat7是类别。我需要搜索给定邮政编码中的类别。
以下是表格格式:
CREATE TABLE IF NOT EXISTS `uk_data` (
`slno` int(10) NOT NULL AUTO_INCREMENT,
`comp_name` varchar(150) DEFAULT NULL,
`comp_no` varchar(50) DEFAULT NULL,
`comp_street` varchar(100) DEFAULT NULL,
`comp_area` varchar(100) DEFAULT NULL,
`comp_post_code` varchar(15) DEFAULT NULL,
`comp_phone` varchar(100) DEFAULT NULL,
`comp_phone1` varchar(100) DEFAULT NULL,
`cat1` varchar(100) DEFAULT NULL,
`cat2` varchar(100) DEFAULT NULL,
`cat3` varchar(100) DEFAULT NULL,
`cat4` varchar(100) DEFAULT NULL,
`cat5` varchar(100) DEFAULT NULL,
`cat6` varchar(100) DEFAULT NULL,
`cat7` varchar(100) DEFAULT NULL,
`cat8` decimal(9,6) DEFAULT NULL,
`cat9` decimal(9,6) DEFAULT NULL,
`cat10` varchar(15) DEFAULT NULL,
PRIMARY KEY (`slno`),
UNIQUE KEY `Phone` (`comp_phone`),
KEY `cat10` (`cat10`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=74504 ;
我正在使用的输出:
$uk_data_radious = comp_post_code($q,$pc_o);
while (($row = $uk_data_radious->fetch()) !== false) {
$comp_name[] = $row['comp_name'];
$comp_phone[] = $row['comp_phone'];
$comp_phone1[] = $row['comp_phone1'];
$post_code[] = $row['cat10'];
$post_code1[] = $row['comp_post_code'];
$comp_no[] = $row['comp_no'];
$comp_street[] = $row['comp_street'];
$comp_area[] = $row['comp_area'];
$cat1[] = $row['cat1'];
$cat2[] = $row['cat2'];
$cat3[] = $row['cat3'];
$cat4[] = $row['cat4'];
$cat5[] = $row['cat5'];
$cat6[] = $row['cat6'];
$cat7[] = $row['cat7'];
$distance_m[] = distance($Latitude[0],$Longitude[0],$row['cat8'],$row['cat9'],"M");
}
答案 0 :(得分:2)
Full Text search在长字符串上的效果更好,可以在任何地方进行搜索。但它需要创建一个特殊的索引,并更改查询(并且与InnoDB表不兼容)。
这是相当多的工作。但是如果之类的查询真的很慢,那么FTI(全文索引)是一种快速的选择。
-
保持之类的查询,你无能为力 - 除非当然改变你在列中组织数据的方式 - 即为了避免喜欢
要以某种方式优化之类的查询,您可以将所有猫合并到一个列中(即添加一个新列 catx ),用一个特殊的char分隔不会出现在你的猫中,就像:
一样,并只做一个“喜欢”(这应该加快一点)。 E.g。
cat1: alpha
cat2: beta
cat3: gamma
...
给出
catx is :alpha:beta:gamma:
并在catx上执行此类操作
catx like :cat
like 搜索算法对长字符串更有效,而不是在较小的字符串上运行多次。当搜索字符串超过3个字符时,MySQL使用非常高效的Turbo Boyer-Moore algorithm。
但我必须警告你:这个策略有几个限制因素
根据经验,我不认为你可以通过这种策略获得超过25%的收益。