導航:首頁 > 編程語言 > 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模糊查詢相關的資料

熱點內容
grub2命令行 瀏覽:618
無法獲取加密卡信息 瀏覽:774
雲伺服器網卡充值 瀏覽:509
編程就是軟體 瀏覽:49
伺服器如何添加許可權 瀏覽:437
引用指針編程 瀏覽:851
手機加密日記本蘋果版下載 瀏覽:63
命令行括弧 瀏覽:176
java程序升級 瀏覽:490
排序演算法之插入類 瀏覽:227
gcccreate命令 瀏覽:73
海爾監控用什麼app 瀏覽:64
系統盤被壓縮開不了機 瀏覽:984
linuxredis30 瀏覽:541
狸窩pdf轉換器 瀏覽:696
ajax調用java後台 瀏覽:905
活塞式壓縮機常見故障 瀏覽:614
break演算法 瀏覽:731
換電池的app是什麼 瀏覽:771
單片機ad采樣快速發送電腦 瀏覽:22