Mysql prepare預(yù)處理的具體使用
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ù)庫應(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客戶端庫,用于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?SQL預(yù)處理(Prepared)的語法實(shí)例與注意事項(xiàng)
- MySQL中預(yù)處理語句prepare、execute與deallocate的使用教程
- 理解Mysql prepare預(yù)處理語句
- php+mysqli預(yù)處理技術(shù)實(shí)現(xiàn)添加、修改及刪除多條數(shù)據(jù)的方法
- php+mysqli使用預(yù)處理技術(shù)進(jìn)行數(shù)據(jù)庫查詢的方法
- PHP mysqli擴(kuò)展庫 預(yù)處理技術(shù)的使用分析
- mysqli預(yù)處理編譯的深入理解
- MySQL中Stmt 預(yù)處理提高效率問題的小研究
- Go?連接?MySQL之?MySQL?預(yù)處理詳解
相關(guān)文章
mysql 導(dǎo)入導(dǎo)出數(shù)據(jù)庫、數(shù)據(jù)表的方法
這篇文章主要介紹了mysql 導(dǎo)入導(dǎo)出數(shù)據(jù)庫、數(shù)據(jù)表的方法,有需要的朋友可以參考一下2013-11-11mysql從一張表查詢批量數(shù)據(jù)并插入到另一表中的完整實(shí)例
這篇文章主要給大家介紹了關(guān)于mysql從一張表查詢批量數(shù)據(jù)并插入到另一表中的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01MySQL count(1)、count(*)、count(字段)的區(qū)別
COUNT在數(shù)據(jù)庫行數(shù)統(tǒng)計(jì)中被廣泛使用,那么你知道MySQL count(1)、count(*)、count(字段)的區(qū)別嗎,本文就想的介紹一下,感興趣的可以了解一下2021-12-12MySQL切分函數(shù)substring()的具體使用
這篇文章主要介紹了MySQL切分函數(shù)substring()的具體使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02跳槽必備之你設(shè)計(jì)索引的原則是什么?怎么避免索引失效?
索引的設(shè)計(jì)可以遵循一些已有的原則,創(chuàng)建索引的時(shí)候請(qǐng)盡量符合這些原則,便于提升索引地使用效率,更高效地使用索引。今天給大家介紹跳槽必備之你設(shè)計(jì)索引的原則是什么?怎么避免索引失效?感興趣的朋友一起看看吧2021-05-05