导航:首页 > 编程语言 > phpmysql模糊查询

phpmysql模糊查询

发布时间:2022-05-02 08:23:23

php+mysql 如何优化千万级数据模糊查询加快

关于mysql处理百万级以上的数据时如何提高其查询速度的方法

最近一段时间由于工作需要,开始关注针对Mysql数据库的select查询语句的相关优化方法。

由于在参与的实际项目中发现当mysql表的数据量达到百万级时,普通SQL查询效率呈直线下降,而且如果where中的查询条件较多时,其查询速度简直无法容忍。曾经测试对一个包含400多万条记录(有索引)的表执行一条条件查询,其查询时间竟然高达40几秒,相信这么高的查询延时,任何用户都会抓狂。因此如何提高sql语句查询效率,显得十分重要。以下是网上流传比较广泛的30种SQL查询语句优化方法:
1、应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。

2、对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。

3、应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num is null
可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
select id from t where num=0

4、尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num=10 or num=20
可以这样查询:
select id from t where num=10
union all
select id from t where num=20

5、下面的查询也将导致全表扫描:(不能前置百分号)
select id from t where name like ‘%c%’
若要提高效率,可以考虑全文检索。

6、in 和 not in 也要慎用,否则会导致全表扫描,如:
select id from t where num in(1,2,3)
对于连续的数值,能用 between 就不要用 in 了:
select id from t where num between 1 and 3

7、如果在 where 子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然 而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描:
select id from t where num=@num
可以改为强制查询使用索引:
select id from t with(index(索引名)) where num=@num

8、应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:
select id from t where num/2=100
应改为:
select id from t where num=100*2

9、应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:
select id from t where substring(name,1,3)=’abc’–name以abc开头的id
select id from t where datediff(day,createdate,’2005-11-30′)=0–’2005-11-30′生成的id
应改为:
select id from t where name like ‘abc%’
select id from t where createdate>=’2005-11-30′ and createdate<’2005-12-1′

10、不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。

11、在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使 用,并且应尽可能的让字段顺序与索引顺序相一致。

12、不要写一些没有意义的查询,如需要生成一个空表结构:
select col1,col2 into #t from t where 1=0
这类代码不会返回任何结果集,但是会消耗系统资源的,应改成这样:
create table #t(…)

13、很多时候用 exists 代替 in 是一个好的选择:
select num from a where num in(select num from b)
用下面的语句替换:
select num from a where exists(select 1 from b where num=a.num)

14、并不是所有索引对查询都有效,SQL是根据表中数据来进行查询优化的,当索引列有大量数据重复时,SQL查询可能不会去利用索引,如一表中有字段 sex,male、female几乎各一半,那么即使在sex上建了索引也对查询效率起不了作用。

15、索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有 必要。

16.应尽可能的避免更新 clustered 索引数据列,因为 clustered 索引数据列的顺序就是表记录的物理存储顺序,一旦该列值改变将导致整个表记录的顺序的调整,会耗费相当大的资源。若应用系统需要频繁更新 clustered 索引数据列,那么需要考虑是否应将该索引建为 clustered 索引。

17、尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接时会 逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。

18、尽可能的使用 varchar/nvarchar 代替 char/nchar ,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。

19、任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。

20、尽量使用表变量来代替临时表。如果表变量包含大量数据,请注意索引非常有限(只有主键索引)。

21、避免频繁创建和删除临时表,以减少系统表资源的消耗。

22、临时表并不是不可使用,适当地使用它们可以使某些例程更有效,例如,当需要重复引用大型表或常用表中的某个数据集时。但是,对于一次性事件,最好使 用导出表。

23、在新建临时表时,如果一次性插入数据量很大,那么可以使用 select into 代替 create table,避免造成大量 log ,以提高速度;如果数据量不大,为了缓和系统表的资源,应先create table,然后insert。

24、如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先 truncate table ,然后 drop table ,这样可以避免系统表的较长时间锁定。

25、尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该考虑改写。

26、使用基于游标的方法或临时表方法之前,应先寻找基于集的解决方案来解决问题,基于集的方法通常更有效。

27、与临时表一样,游标并不是不可使用。对小型数据集使用 FAST_FORWARD 游标通常要优于其他逐行处理方法,尤其是在必须引用几个表才能获得所需的数据时。在结果集中包括“合计”的例程通常要比使用游标执行的速度快。如果开发时 间允许,基于游标的方法和基于集的方法都可以尝试一下,看哪一种方法的效果更好。

28、在所有的存储过程和触发器的开始处设置 SET NOCOUNT ON ,在结束时设置 SET NOCOUNT OFF 。无需在执行存储过程和触发器的每个语句后向客户端发送 DONE_IN_PROC 消息。

29、尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理。

30、尽量避免大事务操作,提高系统并发能力。

⑵ php实现模糊查询

具体的错误信息是什么呢?光这样这样有些难查找

PHP 是一种创建动态交互性站点的强有力的服务器端脚本语言。

PHP 是免费的,并且使用广泛。对于像微软 ASP 这样的竞争者来说,PHP 无疑是另一种高效率的选项。

PHP 是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点,利于学习,使用广泛,主要适用于Web开发领域。

⑶ php+mysql怎样在一个页面中同时存在模糊查询和精准查询

$sql="";
if($type="mohu"){
$sql="select * from 表名 where name like '%a%'";
}else{
$sql="select * from 表名 where name='aa'";
}
这样就可以了吧,用一个变量区分一下

⑷ php+mysql模糊查询功能

这样查询
在程序中将输入的“123”,转换为多个字符串:
"%1%" "%2%" "%3%" "%12%" "%13%" "%23%" "%123%"
然后:
构造
select * from 数据表 where
(
检索字段 like "%1%"
or 检索字段 like "%2%"
or 检索字段 like "%3%"
or 检索字段 like "%12%"
or 检索字段 like "%13%"
or 检索字段 like "%23%"
or 检索字段 like "%123%"
)
不会hi我 祝你好运

⑸ php mysql 模糊查询

原谅我的看错.楼上的朋友.
不过就算你在头文件设了utf-8.就能保证数据库服务器->服务器->客户端都不乱码吗?Mysql我就不清楚了. mssql 就不一定啦. 如果是mssql我建议必须用函数编码.
另我感到怀疑的是楼上的同学 居 然 用 str_split() 函 数 去 拆 分 中 文 字 符 ....我没试过结果.如果结果可行.那使用楼上的同学的吧.毕竟比较简单.我这种比较保险.

瞧俺老孙的法宝.........BINGO 开始

html 页面
<input type=“text”>
<script>var url = "fuck.php?fuck=" + escape(document.getElementsByTagName("input")[0].value);
//传递和跳转的window函数我就不写了喔
</script>

php 页面
// php 解码函数
function unescape($str) {
$str = rawurldecode($str);
preg_match_all("/%u.{4}|&#x.{4};|&#d+;|.+/U",$str,$r);
$ar = $r[0];
foreach($ar as $k=>$v) {
if(substr($v,0,2) == "%u")
$ar[$k] = mb_convert_encoding(pack("H4",substr($v,-4)),"gb2312","UCS-2");
elseif(substr($v,0,3) == "&#x")
$ar[$k] = mb_convert_encoding(pack("H4",substr($v,3,-1)),"gb2312","UCS-2");
elseif(substr($v,0,2) == "&#") {
$ar[$k] = mb_convert_encoding(pack("H4",substr($v,2,-1)),"gb2312","UCS-2");
}
}
return join("",$ar);
}

// 这里法宝开始 完美解决每个汉字拆分出来

$arr = explode("u",$_GET["fuck"]); //是因为escape编码后每个汉字的开头都是u
$shit = "";
foreach($arr as $value)
{
$value = unescape($value);// 网上找到的php 解码函数
$shit .= "%".$value."%"; //字符串拼接好了可供查询了呵呵
}
$sql = "select * from table where con like ‘$shit’";
//或者 $shit = "'".$shit."'"; 然后$sql = "select * from table where con like“.$shit.;

xxsql_query($sql); // 大功告成! 后面的echo 自己喜欢怎样格式输出就输出呗.

⑹ PHP中我的MYSQL模糊查询语句到底错在哪里请高手指教!

格式写法上很多都不规范
你最好对$stt进行tirm处理 去掉首尾的空格
$b_posts应该是个表名 以变量的形式引入不太妥当

下面的例子是我学PHP第5天写的 你参考下 不过千万不要学这种写法 仅适合初学者
<?php
require_once("./include/config.php");
require_once("./include/usercheck.php");

if (!empty($_GET["cs_Id"]))
{
$cs_Id = $_GET["cs_Id"];
}
elseif (!empty($_POST["cs_Id"]))
{
$cs_Id = $_POST["cs_Id"];
}
else
{
$cs_Id = 1;
}

$keyword = "";

if (!empty($_POST["keyword"]))
{
$keyword = $_POST["keyword"];
}
elseif (!empty($_GET["keyword"])){
$keyword = $_GET["keyword"];
}
else
{
$keyword = "";
}

if(isset($cs_Id))
{
// $sql="select * from tbarticle where cs_Id=".$cs_Id."";
// //echo $sql;
// $res=mysql_query($sql);

$wheresql = "";

if (!empty($keyword))
{
$wheresql = " and ae_Title like '%" .$keyword. "%'";
}

$sql1="select count(*) as amount from tbarticle where cs_Id=".$cs_Id.$wheresql." ";
//echo $sql1;

$result=mysql_query($sql1);

//获取总数据量
$row=mysql_fetch_array($result);
$amount=$row['amount'];

//exit;
//获取当前页数
if(isset($_GET['page']))
{
$page=intval($_GET['page']);
}
else
{
$page=1;
}
//每页数量
$page_size=2;
//计算总共有多少页

if($amount==0)
{
echo"没有任何数据";
exit;
}
if($amount < $page_size)
{
$page_count=1;
}
//if($amount%$page_size){//拿总数据除以每页的总数,如果有余数,那么总页数等于商+1
$page_count=ceil($amount/$page_size);

//翻页链接
$page_string='';

if ($page==1)
$page_string='第一页|<a href=classcontentshow.php?cs_Id='.$cs_Id.'&page='.($page+1).'&keyword='.$keyword.'>下一页</a>|';
elseif(($page==$page_count||($page_count==0)))
$page_string='<a href=classcontentshow.php?cs_Id='.$cs_Id.'&page='.($page-1).'&keyword='.$keyword.'>上一页</a>|<a href=classcontentshow.php?cs_Id='.$cs_Id.'&page='.$page_count.'&keyword='.$keyword.'>尾页</a>';
elseif(($page>1)&&($page<$page_count))
$page_string='<a href=classcontentshow.php?cs_Id='.$cs_Id.'&page='.($page-1).'&keyword='.$keyword.'>上一页</a>|<a href=classcontentshow.php?cs_Id='.$cs_Id.'&page='.($page+1).'&keyword='.$keyword.'>下一页</a>|';
//||($page_count==0)

//获取数据
$a=($page-1)*$page_size;
$b=$page_size;
$query_s="select * from tbarticle where cs_Id=".$cs_Id.$wheresql." order by ae_Id limit $a,$b";
$result_s=mysql_query($query_s);
//echo $query_s;

//$rows=mysql_fetch_assoc($res);
echo"<table border=1>";

while($rows=mysql_fetch_array($result_s))
{
$rows["ae_Date"]= date("Y-m-j H:i:s",$rows["ae_Date"]);
echo "<tr>";
echo "<td align='left' valign='middle'><a href='articlereadshow.php?ae_Id=".$rows["ae_Id"]."' target=_blank><font>".$rows["ae_Title"]."[".$rows["ae_Date"]."]</font></a> ";

echo "</tr>";
}
echo "</table>";
echo '一共有'.$page_count.'页<p>';
echo '当前为第'.$page.'页<p>';
echo $page_string;
}

//echo "test";
//echo $keyword;
//print_r($_POST);
?>

<form name=xxx action="classcontentshow.php" method="post">
<input type=text name=keyword value="<? echo $keyword;?>">
<input type=hidden name=cs_Id value="<? echo $cs_Id;?>">
<input type=submit name=mysub>
</form>

⑺ PHP+mysql中实现模糊查询,只是把‘=’改成了‘like’,但是没有变成模糊查询。 怎么修改啊

可以改成这样,$sql="SELECT*农产品like'".$name."%'";
模糊匹配中需要有%之类的通配符来表示$name以外部分的名字,我写的列子中%的位置根据你的实际情况来定,放在$name前面,后面,或者前后都有

⑻ 在PHP中,mysql的模糊查询语句是怎么写的啊

sql = "select * from users where username like '%"&bianliang&"%' and sex like '%"&bianliang&"%'"

⑼ 请教高手:php+mysql中精确查询代码如何改为模糊查询代码

首先,我说你的这个用的不对:$colname_rsTitle = (get_magic_quotes_gpc()) ? $_POST['txtTitle'] : addslashes($_POST['txtTitle']);

你可以使用$url=$_SERVER['QUERY_STRING'];然后利用parse_url来将它转换成为数组:$url_array=parse_url($url);
SQL:“SELECT Title, Author, Keyword, `Public` FROM literaturesinfo WHERE (Title = %$url_array['title']%);”
试试看!

⑽ php+MYSQL模糊查找关键字的问题

如果是通过姓名查找呢,我建议你还是把所有姓都定义好在查询吧(可以通过拼音索引增加软件友好度),这样查询的效率会好很多,总比每次都要把姓名从数据库里拿出来再抽象成模糊查询字段
再查询要快吧。
如果真是可以自己抽象出来所有符合的模糊对象的话,我看快赶上人工智能了,计算量不小。现阶段应该还用不到。用到了,我们也做不出来。
不知道对你有用吗,第二次回答问题。
O(∩_∩)O哈哈~

阅读全文

与phpmysql模糊查询相关的资料

热点内容
职业生涯pdf 浏览:953
ubuntu安装软件php 浏览:158
黑马程序员退学流程 浏览:362
网页服务器崩溃怎么回事 浏览:650
cnc编程前景怎么样 浏览:319
lniux命令详解 浏览:493
linuxmysql查询日志 浏览:368
老捷达伙伴压缩比 浏览:93
改后缀加密 浏览:433
邮局选址问题算法 浏览:14
河北服务器内存云主机 浏览:12
在电脑上怎么找到加密狗图标 浏览:435
电脑的浏览器怎么打开pdf文件怎么打开 浏览:142
pdf卡片库下载 浏览:11
单片机中二进制表示什么 浏览:725
java网络编程推荐 浏览:795
施耐德开关编程 浏览:66
组织胚胎学pdf 浏览:844
linux查看发包 浏览:496
加密货币交易所暴利时代 浏览:824