濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > Mysql prepare預(yù)處理的具體使用

Mysql prepare預(yù)處理的具體使用

熱門標(biāo)簽:大眾點(diǎn)評(píng)星級(jí)酒店地圖標(biāo)注 400電話可以辦理嗎 高清地圖標(biāo)注道路 云南電商智能外呼系統(tǒng)價(jià)格 智能外呼系統(tǒng)復(fù)位 外東北地圖標(biāo)注 臨清電話機(jī)器人 話務(wù)外呼系統(tǒng)怎么樣 拉卡拉外呼系統(tǒng)

MySQL PREPARE預(yù)處理技術(shù)意義在于,是為了減輕服務(wù)器壓力的一種技術(shù)。

就是說絕大多數(shù)情況下,某需求某一條SQL語句可能會(huì)被反復(fù)調(diào)用執(zhí)行,或者每次執(zhí)行的時(shí)候只有個(gè)別的值不同。
比如:

  • SELECT的 WHERE子句值不同;
  • UPDATE的 SET子句值不同;
  • INSERT的 VALUES值不同;
    如果每次都需要經(jīng)過上面的詞法語義解析、語句優(yōu)化、制定執(zhí)行計(jì)劃等,則效率就明顯下降。

1.預(yù)處理

MySQL提供了對(duì)服務(wù)器端準(zhǔn)備語句的支持,就叫預(yù)處理。

這種支持利用了高效的客戶機(jī)/服務(wù)器二進(jìn)制協(xié)議,使用帶有參數(shù)值占位符的預(yù)編譯語句有以下好處:

  • 減少每次執(zhí)行語句時(shí)解析語句的開銷。通常,數(shù)據(jù)庫(kù)應(yīng)用程序處理大量幾乎相同的語句,只對(duì)子句中的字面值或變量值進(jìn)行更改,例如用于查詢和刪除的WHERE、用于更新的SET和用于插入的values。
  • 防止SQL注入攻擊。參數(shù)值可以包含未轉(zhuǎn)義的SQL引號(hào)和分隔符。

預(yù)處理接口

1.應(yīng)用程序中的預(yù)處理語句
可以通過客戶端編程接口使用服務(wù)器端準(zhǔn)備好的語句,包括用于C程序的MySQL C API客戶端庫(kù),用于Java程序的MySQL Connector/J,以及用于使用。NET技術(shù)的程序的MySQL Connector/NET。例如,C API提供了一組函數(shù)調(diào)用,這些函數(shù)調(diào)用構(gòu)成了它的預(yù)編譯語句API

2.SQL腳本中的準(zhǔn)備語句
還有一個(gè)用于預(yù)處理語句的替代SQL接口。但不需要編程,在SQL級(jí)別直接可用,可以在任何可以將SQL語句發(fā)送到要執(zhí)行的服務(wù)器的程序中使用它,例如mysql客戶端程序。

2.預(yù)處理應(yīng)用方式

預(yù)處理語句的SQL語法基于三個(gè)SQL語句:

  • PREPARE語句準(zhǔn)備執(zhí)行。
  • EXECUTE執(zhí)行一條預(yù)處理語句。
  • DEALLOCATE PREPARE釋放一個(gè)預(yù)處理語句。

A.例子:

預(yù)處理語句無法跨SESSION操作:

mysql>CREATE TABLE `t1` (
  `id` int NOT NULL,
   NAME varchar(20),
KEY `idx_id` (`id`)
) ENGINE=InnoDB ;
 
mysql>INSERT INTO t1(id,name) values(1,'A'),(2,'B'),(3,'C'),(4,'D'),(5,'E'),(6,'F');
 
#設(shè)定預(yù)處理語句
mysql>PREPARE stmt1 FROM  'SELECT * FROM t1 WHERE a=? ';
 
#設(shè)置傳遞變量
mysql>SET @a = 8;
 
#執(zhí)行語句
mysql>EXECUTE stmt1 USING @a;
 
#釋放預(yù)處理語句
mysql>DEALLOCATE PREPAR stmt1;

B.預(yù)處理對(duì)執(zhí)行計(jì)劃變化跟蹤

通過觀察status指標(biāo)Select_scan(執(zhí)行全表搜索查詢的數(shù)量)變化判斷是否會(huì)受到數(shù)據(jù)量變更的影響。

預(yù)處理sql語句隨著數(shù)據(jù)量的變化執(zhí)行計(jì)劃也在變更。

C.存儲(chǔ)過程包含預(yù)處理

預(yù)處理語句在存儲(chǔ)的例程中創(chuàng)建預(yù)處理語句,則在存儲(chǔ)的例程結(jié)束時(shí)不會(huì)釋放該語句。

DELIMITER //
 
DROP PROCEDURE IF EXISTS proc_prepared;
CREATE PROCEDURE proc_prepared()
BEGIN
DECLARE a INT;
DECLARE i INT;
PREPARE stmt1 FROM  'SELECT * FROM t1 WHERE id>? ';
SET @a = 5;
EXECUTE stmt1 USING @a;
END //
 
DELIMITER ;
 
call proc_prepared();
存儲(chǔ)過程之后單獨(dú)調(diào)用預(yù)處理語句,返回結(jié)果集:說明預(yù)處理沒有銷毀
 
SET @a = 5;
EXECUTE stmt1 USING @a;
+----+------+
| id | NAME |
+----+------+
|  6 | F    |
。。。

存儲(chǔ)過程之后單獨(dú)調(diào)用預(yù)處理語句,返回結(jié)果集:說明預(yù)處理沒有銷毀

SET @a = 5; EXECUTE stmt1 USING @a; +----+------+ | id | NAME | +----+------+ | 6 | F | 。。。

D.通過profile 查看解析語句的開銷

通過profile各種語句執(zhí)行時(shí)間,解析語句花費(fèi)的時(shí)間都在0.01秒以內(nèi)??梢院雎圆挥?jì)。
所以目前在預(yù)處理方面上沒有發(fā)現(xiàn)明顯的優(yōu)勢(shì)。

3.總結(jié)

預(yù)編譯初始的作用:

  • 提高效率:事先解析、檢查、編譯等工作。
  • 提高安全性:預(yù)防SQL注入

局限性和實(shí)際效果:

  • 預(yù)處理因?yàn)榫窒拊趕ession級(jí)別,現(xiàn)在無法體現(xiàn)真正的價(jià)值。因?yàn)閙ysql GA版本沒有線程池概念,每個(gè)鏈接就是每個(gè)session
  • 解析編譯語句的開銷 基本對(duì)于mysql環(huán)境來說忽略不計(jì)
  • 執(zhí)行計(jì)劃也是隨著數(shù)據(jù)量而變化的。

從局限性和實(shí)際效果來看,目前沒有發(fā)揮應(yīng)有的功能。不適合聲場(chǎng)環(huán)境中使用。

到此這篇關(guān)于Mysql prepare預(yù)處理的具體使用的文章就介紹到這了,更多相關(guān)Mysql prepare預(yù)處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • MySQL中預(yù)處理語句prepare、execute與deallocate的使用教程
  • 理解Mysql prepare預(yù)處理語句

標(biāo)簽:揚(yáng)州 無錫 溫州 阿里 山西 福州 定西 三明

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Mysql prepare預(yù)處理的具體使用》,本文關(guān)鍵詞  Mysql,prepare,預(yù)處理,的,具體,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Mysql prepare預(yù)處理的具體使用》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于Mysql prepare預(yù)處理的具體使用的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    莱州市| 安达市| 宁南县| 华安县| 富民县| 南雄市| 新津县| 石城县| 五大连池市| 中牟县| 新建县| 尚志市| 教育| 阳城县| 汪清县| 宝鸡市| 无为县| 大冶市| 府谷县| 安溪县| 定安县| 元江| 绥芬河市| 保亭| 邢台县| 红原县| 黔东| 石景山区| 县级市| 奉节县| 泾源县| 东乡族自治县| 马边| 若羌县| 巫溪县| 武夷山市| 安吉县| 耿马| 禄丰县| 南通市| 罗甸县|