mysql存儲(chǔ)過(guò)程游標(biāo)的使用 簡(jiǎn)述在MySQL中使用游標(biāo)的原因
夕逆IT
- 開(kāi)發(fā)語(yǔ)言
- 2023-08-13 10:46:44
- 367

老鐵們,大家好,相信還有很多朋友對(duì)于mysql存儲(chǔ)過(guò)程游標(biāo)的使用和簡(jiǎn)述在MySQL中使用游標(biāo)的原因的相關(guān)問(wèn)題不太懂,沒(méi)關(guān)系,今天就由我來(lái)為大家分享分享mysql存儲(chǔ)過(guò)程...
老鐵們,大家好,相信還有很多朋友對(duì)于mysql存儲(chǔ)過(guò)程游標(biāo)的使用和簡(jiǎn)述在MySQL中使用游標(biāo)的原因的相關(guān)問(wèn)題不太懂,沒(méi)關(guān)系,今天就由我來(lái)為大家分享分享mysql存儲(chǔ)過(guò)程游標(biāo)的使用以及簡(jiǎn)述在MySQL中使用游標(biāo)的原因的問(wèn)題,文章篇幅可能偏長(zhǎng),希望可以幫助到大家,下面一起來(lái)看看吧!
mysql存儲(chǔ)過(guò)程中,游標(biāo)與返回參數(shù)不兼容嗎
你是用ado連接數(shù)據(jù)庫(kù)的吧,我在VC下也同樣出現(xiàn)這樣的問(wèn)題,使用游標(biāo)的時(shí)候獲取不到輸出值,且還會(huì)導(dǎo)致連接中斷。估計(jì)是mysql存儲(chǔ)過(guò)程還不夠完善,在oracle使用就沒(méi)有任何問(wèn)題。
你可以用MysqlApi直接連接mysql,應(yīng)該沒(méi)有這樣的問(wèn)題.
如何快速有效地掌握數(shù)據(jù)庫(kù)語(yǔ)言MySql
如何快速有效掌握數(shù)據(jù)庫(kù)語(yǔ)言SQL?
數(shù)據(jù)庫(kù)有很多種,常見(jiàn)的數(shù)據(jù)庫(kù)都是關(guān)系型數(shù)據(jù)庫(kù),如MySQL、Oracle、SQLServer等,當(dāng)然,還有非關(guān)系型數(shù)據(jù)庫(kù),如MongoDB、Hbase等。
對(duì)于初學(xué)者,建議從MySQL開(kāi)始,因?yàn)镸ySQL是目前使用最廣泛的關(guān)系型數(shù)據(jù)庫(kù),學(xué)習(xí)起來(lái)相對(duì)容易,下面給出一些學(xué)習(xí)建議。
MySQL安裝首先需要安裝MySQL,Windows下推薦使用MySQLInstaller這個(gè)工具來(lái)安裝MySQL。
下載地址:
https://dev.mysql.com/downloads/windows/installer/
通過(guò)Installer安裝3個(gè)東西:
MySQLServer(MySQL服務(wù)器,必需)
MySQLNotifier(監(jiān)視器:用于啟動(dòng)、重啟MySQLServer,非必需)
MySQLWorkbench(寫(xiě)SQL語(yǔ)句的工具,非必需)
如果你是一個(gè)PHP愛(ài)好者,可能安裝過(guò)一些集成工具如xampp,phpadmin等,這些工具自帶MySQLServer,也是可以的。
啟動(dòng)、連接MySQLServerMySQLServer安裝好后,默認(rèn)是自動(dòng)啟動(dòng)的。
如果需要重啟MySQL服務(wù),有兩種方式:
1、通過(guò)MySQLNotifier來(lái)啟動(dòng)或者重啟MySQLServer(注意,不是MySQLWorkbench)。
2、通過(guò)“我的電腦”-“管理”-“服務(wù)和應(yīng)用程序”-“服務(wù)”進(jìn)行啟動(dòng)或者重啟。
MySQLServer啟動(dòng)后,需要連接MySQL,推薦使用MySQLWorkbench,當(dāng)然用cmd命令行也可以。
數(shù)據(jù)庫(kù)基本操作數(shù)據(jù)庫(kù)是用來(lái)存放數(shù)據(jù)表的地方,相當(dāng)于電腦上的文件夾(database),里面可以放多個(gè)Excel表格(table)。
數(shù)據(jù)表基本操作數(shù)據(jù)表是用來(lái)存放數(shù)據(jù)的地方,相當(dāng)于電腦上的Excel表格(其實(shí)不準(zhǔn)確),一張張二維的表格,里面可以存放數(shù)據(jù)。
MySQL中的數(shù)據(jù)類(lèi)型常用的數(shù)據(jù)類(lèi)型有三種:字符型、數(shù)值型和日期時(shí)間型。
常用查詢(xún)操作SQL語(yǔ)句的核心在于查詢(xún),需要掌握的查詢(xún)操作如下圖所。
以下是關(guān)于SQL的一些其他操作,對(duì)于數(shù)據(jù)分析師來(lái)說(shuō),不太常用,有興趣可以了解一下。
索引索引類(lèi)似于拿漢語(yǔ)字典的目錄頁(yè)(索引),我們可以按拼音、筆畫(huà)、偏旁部首等排序的目錄(索引)快速查找到需要的字。
自定義函數(shù)MySQL本身提供了很多內(nèi)置函數(shù),但有時(shí)候需要實(shí)現(xiàn)我們自己的一些功能,就需要自定義函數(shù)。
自定義函數(shù)的函數(shù)體由多條可用的MySQL語(yǔ)句,流程控制,變量聲明等語(yǔ)句構(gòu)成。
存儲(chǔ)過(guò)程存儲(chǔ)例程是存儲(chǔ)在數(shù)據(jù)庫(kù)服務(wù)器中的一組sql語(yǔ)句,通過(guò)在查詢(xún)中調(diào)用一個(gè)指定的名稱(chēng)來(lái)執(zhí)行這些sql語(yǔ)句命令。
存儲(chǔ)過(guò)程一般是作為獨(dú)立部分來(lái)執(zhí)行,而函數(shù)可以作為查詢(xún)語(yǔ)句的一個(gè)部分來(lái)調(diào)用。
事務(wù)事務(wù)是一組SQL語(yǔ)句,用來(lái)維護(hù)數(shù)據(jù)庫(kù)的完整性,保證成批的sql操作要么完全執(zhí)行,要么完全不執(zhí)行。
例如,銀行賬戶轉(zhuǎn)賬業(yè)務(wù),例如客戶A轉(zhuǎn)賬100元給客戶B,這里涉及兩個(gè)操作:
客戶A減去100元
客戶B增加100元
必須同時(shí)成功或者同時(shí)失敗。
游標(biāo)游標(biāo)(cursor),一個(gè)存儲(chǔ)在MySQL服務(wù)器上的數(shù)據(jù)庫(kù)查詢(xún),被select語(yǔ)句檢索出來(lái)的結(jié)果集,在存儲(chǔ)了游標(biāo)之后,可以根據(jù)需要滾動(dòng)或?yàn)g覽其中的數(shù)據(jù),多用于存儲(chǔ)過(guò)程。
歡迎關(guān)注【數(shù)據(jù)科學(xué)吧】,分享數(shù)據(jù)科學(xué)相關(guān)的知識(shí)!
零基礎(chǔ)想自學(xué)sql數(shù)據(jù)庫(kù)應(yīng)該從哪入手
1、在關(guān)系型數(shù)據(jù)庫(kù)年代,SQL可以學(xué)得非常深,當(dāng)然也非常難學(xué)。學(xué)好了可以成為非常高薪的人才。
2、現(xiàn)在傾向于No-SQL,去SQL化,我也不建議重度使用SQL的各個(gè)比較深的功能。我覺(jué)得學(xué)會(huì)基本的建庫(kù)建表建字段,基本的增刪改查就行了,連視圖都可以不用學(xué)。存儲(chǔ)過(guò)程可以學(xué)學(xué),但也不是必須的。Join就千萬(wàn)不要再用了。舉個(gè)例子,兩個(gè)表都是不小的表,用join時(shí)動(dòng)輒幾秒的計(jì)算量,會(huì)導(dǎo)致系統(tǒng)非常慢,我在這里就吃過(guò)虧。其實(shí)可以單表操作,等結(jié)果出來(lái)后,再循環(huán)每條記錄查出對(duì)應(yīng)join的記錄即可。其實(shí)想想,我們頁(yè)面上每次多是顯示10-20條記錄,這樣循環(huán)查詢(xún)的次數(shù)非常少,相對(duì)于join動(dòng)輒百萬(wàn)次的計(jì)算來(lái)說(shuō),幾十次就可以忽略不計(jì)。所以現(xiàn)在只要遇到sql執(zhí)行的時(shí)間太久,我就把相應(yīng)的地方改成沒(méi)有join的簡(jiǎn)單語(yǔ)句(代碼量比較大,一次改過(guò)來(lái)比較費(fèi)勁,只能遇到再改)。
3、關(guān)于訪問(wèn)的SQL的代碼,一旦沒(méi)有join,沒(méi)有復(fù)雜的東西,就會(huì)變得非常簡(jiǎn)單。這時(shí)候我就會(huì)做一個(gè)基類(lèi),把相關(guān)的增刪改查工作直接做好,這樣其它類(lèi)就基本不用寫(xiě)什么代碼,全部繼承自基類(lèi)即可。
經(jīng)過(guò)上面的處理,你就會(huì)發(fā)現(xiàn)SQL其實(shí)很簡(jiǎn)單(當(dāng)然不是真的簡(jiǎn)單,而是復(fù)雜的東西不符合現(xiàn)在的趨勢(shì))。而且這樣處理后,我們的應(yīng)用就可以微服務(wù)化,相互之間的關(guān)聯(lián)減少,耦合降低。所以建議不要花太多時(shí)間在學(xué)SQL上,我們只需要用最基本的功能即可。
你給初學(xué)編程者的建議有哪些
謝謝邀請(qǐng)!
學(xué)習(xí)編程基本上有兩種情況,一種情況是處于愛(ài)好,另一種情況是工作需要,簡(jiǎn)單的說(shuō)就是業(yè)余組和專(zhuān)業(yè)組的區(qū)別。不同情況的學(xué)習(xí)路線是完全不同的,下面分別進(jìn)行闡述。
專(zhuān)業(yè)從事軟件開(kāi)發(fā)的學(xué)習(xí)路線計(jì)劃從事專(zhuān)業(yè)軟件開(kāi)發(fā)的準(zhǔn)程序員需要有一個(gè)系統(tǒng)的學(xué)習(xí)過(guò)程,給出以下學(xué)習(xí)建議:
首先要選擇一門(mén)編程語(yǔ)言,建議從Java、C、Python、PHP這幾門(mén)語(yǔ)言中選擇一個(gè),這幾門(mén)語(yǔ)言是目前程序員廣泛使用的語(yǔ)言,具有大量的用戶群和豐富的解決方案。制定一個(gè)系統(tǒng)的學(xué)習(xí)計(jì)劃,以Java為例需要按順序掌握如下內(nèi)容:Java基本語(yǔ)法、面向?qū)ο缶幊踢^(guò)程、Java操作數(shù)據(jù)庫(kù)、Java網(wǎng)絡(luò)編程、Java分布式編程、Web編程、SpringMVC(框架可能需要多學(xué)一些)。
選擇一個(gè)數(shù)據(jù)庫(kù)產(chǎn)品深入學(xué)習(xí),建議從Oracle、MySql兩個(gè)數(shù)據(jù)庫(kù)產(chǎn)品中選擇一個(gè),原因有兩個(gè):一個(gè)是與Java的兼容性好,另外一個(gè)原因是這兩個(gè)數(shù)據(jù)庫(kù)產(chǎn)品有廣泛的用戶基礎(chǔ)。制定一個(gè)系統(tǒng)的學(xué)習(xí)計(jì)劃,以MySql為例需要掌握如下內(nèi)容:MySql安裝、建庫(kù)、數(shù)據(jù)類(lèi)型、建表、查詢(xún)、排序、數(shù)據(jù)過(guò)濾、通配符和正則表達(dá)式的使用、數(shù)據(jù)處理函數(shù)的使用、數(shù)據(jù)分組、關(guān)聯(lián)表創(chuàng)建、組合查詢(xún)、數(shù)據(jù)插入、數(shù)據(jù)更新、數(shù)據(jù)刪除、創(chuàng)建和使用視圖、創(chuàng)建和使用存儲(chǔ)過(guò)程、游標(biāo)的使用、觸發(fā)器的使用、事務(wù)管理、安全管理、國(guó)際化、數(shù)據(jù)維護(hù)和優(yōu)化。數(shù)據(jù)庫(kù)內(nèi)容較多,作為程序員來(lái)說(shuō)數(shù)據(jù)庫(kù)是必須掌握的重要內(nèi)容,需要深入系統(tǒng)的學(xué)習(xí)。
選擇一個(gè)Linux系列操作系統(tǒng),建議從CentOS、Ubuntu、Redhat三個(gè)產(chǎn)品中選擇一個(gè),這三個(gè)版本的Linux有廣泛的用戶基礎(chǔ)和較好的性能。作為程序員無(wú)論使用C、Java還是Python或PHP基本上都需要跟Linux系統(tǒng)打交道,因?yàn)榇蟛糠殖绦蚝笈_(tái)的部署和運(yùn)行環(huán)境都是基于Linux系列操作系統(tǒng),學(xué)習(xí)Linux系統(tǒng)對(duì)專(zhuān)業(yè)程序員來(lái)說(shuō)是必修課。
有良好的數(shù)學(xué)基礎(chǔ),建議學(xué)好線性代數(shù)、概率論與數(shù)理統(tǒng)計(jì)、離散數(shù)學(xué)(組合數(shù)學(xué))、高等數(shù)學(xué)、算法導(dǎo)論(很重要)這幾門(mén)課程。程序開(kāi)發(fā)問(wèn)題說(shuō)到底就是數(shù)學(xué)問(wèn)題,簡(jiǎn)單的說(shuō)程序就是算法和數(shù)據(jù)結(jié)構(gòu)的結(jié)合,把程序分解開(kāi)無(wú)非就是代碼、算法、數(shù)據(jù)三個(gè)部分。所以掌握算法是掌握程序開(kāi)發(fā)的核心環(huán)節(jié),無(wú)論是做大數(shù)據(jù)、機(jī)器學(xué)習(xí)、云計(jì)算還是物聯(lián)網(wǎng)、工業(yè)控制這些都離不開(kāi)算法,所以專(zhuān)業(yè)程序員要有一個(gè)良好的數(shù)學(xué)基礎(chǔ)。
最后一個(gè)建議就是做大量的實(shí)驗(yàn),學(xué)程序設(shè)計(jì)離不開(kāi)實(shí)驗(yàn),尤其是專(zhuān)業(yè)程序員更離不開(kāi)大量的實(shí)驗(yàn)。早期可以做一些小實(shí)驗(yàn)來(lái)驗(yàn)證一些概念和想法,后期要參加到實(shí)際的項(xiàng)目組中進(jìn)行實(shí)習(xí),只有接觸到了真實(shí)的需求才能有質(zhì)的提高。
對(duì)要從事軟件開(kāi)發(fā)的準(zhǔn)程序員來(lái)說(shuō),系統(tǒng)的學(xué)習(xí)和實(shí)驗(yàn)是必不可少的環(huán)節(jié),程序員需要有較強(qiáng)的分析能力和學(xué)習(xí)能力。在學(xué)習(xí)的初期如果有專(zhuān)業(yè)程序員進(jìn)行指導(dǎo),會(huì)節(jié)省大量的時(shí)間,當(dāng)然程序設(shè)計(jì)本身也是完全可以自學(xué)的。我在頭條上寫(xiě)了很多關(guān)于java和python的學(xué)習(xí)文章,剛興趣的朋友可以一些交流。業(yè)余愛(ài)好編程者愛(ài)好編程的朋友可能并不需要從事專(zhuān)業(yè)的軟件開(kāi)發(fā)工作,所以在學(xué)習(xí)編程的過(guò)程中可以按照自己的興趣愛(ài)好進(jìn)行選擇。對(duì)于這部分初學(xué)者建議有以下幾點(diǎn):
語(yǔ)言的選擇上可以很寬泛,可以從HTML、JavaScript、Python、PHP等語(yǔ)言中進(jìn)行選擇,因?yàn)檫@幾門(mén)語(yǔ)言比較簡(jiǎn)單,學(xué)習(xí)時(shí)間短、上手快、環(huán)境搭建簡(jiǎn)單但是功能卻很強(qiáng)大,比如Python雖然是一門(mén)腳本式語(yǔ)言,但是在機(jī)器學(xué)習(xí)和大數(shù)據(jù)領(lǐng)域有廣泛的應(yīng)用,對(duì)于初學(xué)者來(lái)說(shuō)它還足夠簡(jiǎn)單和明確,所以是一個(gè)好選擇。當(dāng)然,如果選擇別的語(yǔ)言,比如Java或者C語(yǔ)言也可以,只是學(xué)習(xí)時(shí)間上比較長(zhǎng)。
不需要按步驟系統(tǒng)學(xué)習(xí),可以直接學(xué)習(xí)案例,比如直接學(xué)習(xí)編程200例這樣類(lèi)似的書(shū)籍,里面的小例子很豐富,做起來(lái)也十分有趣。
不需要學(xué)習(xí)Linux系列系統(tǒng),也不需要系統(tǒng)學(xué)習(xí)網(wǎng)絡(luò)和數(shù)據(jù)庫(kù)知識(shí),甚至不需要有數(shù)學(xué)基礎(chǔ)。很多編程愛(ài)好者做的程序大部分是處于興趣愛(ài)好,對(duì)數(shù)據(jù)結(jié)構(gòu)沒(méi)有嚴(yán)苛的要求,程序大多也是基于管理方面的內(nèi)容,所以對(duì)數(shù)學(xué)等專(zhuān)業(yè)內(nèi)容并沒(méi)有多少涉及。
要重視實(shí)驗(yàn),初學(xué)者在學(xué)習(xí)過(guò)程中一定要一邊學(xué)習(xí),一邊實(shí)驗(yàn),作為愛(ài)好并不需要去專(zhuān)業(yè)團(tuán)隊(duì)進(jìn)行實(shí)習(xí),也沒(méi)有必要找專(zhuān)門(mén)的老師進(jìn)行指導(dǎo),完全可以通過(guò)網(wǎng)絡(luò)或書(shū)籍進(jìn)行自學(xué)。如果條件允許,也可以找專(zhuān)業(yè)程序員進(jìn)行指導(dǎo),這樣學(xué)習(xí)起來(lái)會(huì)更容易一些。
以上就是我給學(xué)習(xí)編程的初學(xué)者一些學(xué)習(xí)建議,如果大家有問(wèn)題可以私信我,我會(huì)盡量回答大家的問(wèn)題。如何自動(dòng)從MySql導(dǎo)入百萬(wàn)級(jí)的數(shù)據(jù)到KVDB
關(guān)于mysql處理百萬(wàn)級(jí)以上的數(shù)據(jù)時(shí)如何提高其查詢(xún)速度的方法
最近一段時(shí)間由于工作需要,開(kāi)始關(guān)注針對(duì)Mysql數(shù)據(jù)庫(kù)的select查詢(xún)語(yǔ)句的相關(guān)優(yōu)化方法。
由于在參與的實(shí)際項(xiàng)目中發(fā)現(xiàn)當(dāng)mysql表的數(shù)據(jù)量達(dá)到百萬(wàn)級(jí)時(shí),普通SQL查詢(xún)效率呈直線下降,而且如果where中的查詢(xún)條件較多時(shí),其查詢(xún)速度簡(jiǎn)直無(wú)法容忍。曾經(jīng)測(cè)試對(duì)一個(gè)包含400多萬(wàn)條記錄(有索引)的表執(zhí)行一條條件查詢(xún),其查詢(xún)時(shí)間竟然高達(dá)40幾秒,相信這么高的查詢(xún)延時(shí),任何用戶都會(huì)抓狂。因此如何提高sql語(yǔ)句查詢(xún)效率,顯得十分重要。以下是網(wǎng)上流傳比較廣泛的30種SQL查詢(xún)語(yǔ)句優(yōu)化方法:
1、應(yīng)盡量避免在where子句中使用!=或<>操作符,否則將引擎放棄使用索引而進(jìn)行全表掃描。
2、對(duì)查詢(xún)進(jìn)行優(yōu)化,應(yīng)盡量避免全表掃描,首先應(yīng)考慮在where及orderby涉及的列上建立索引。
3、應(yīng)盡量避免在where子句中對(duì)字段進(jìn)行null值判斷,否則將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描,如:
selectidfromtwherenumisnull
可以在num上設(shè)置默認(rèn)值0,確保表中num列沒(méi)有null值,然后這樣查詢(xún):
selectidfromtwherenum=0
4、盡量避免在where子句中使用or來(lái)連接條件,否則將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描,如:
selectidfromtwherenum=10ornum=20
可以這樣查詢(xún):
selectidfromtwherenum=10
unionall
selectidfromtwherenum=20
5、下面的查詢(xún)也將導(dǎo)致全表掃描:(不能前置百分號(hào))
selectidfromtwherenamelike‘%c%’
若要提高效率,可以考慮全文檢索。
6、in和notin也要慎用,否則會(huì)導(dǎo)致全表掃描,如:
selectidfromtwherenumin(1,2,3)
對(duì)于連續(xù)的數(shù)值,能用between就不要用in了:
selectidfromtwherenumbetween1and3
7、如果在where子句中使用參數(shù),也會(huì)導(dǎo)致全表掃描。因?yàn)镾QL只有在運(yùn)行時(shí)才會(huì)解析局部變量,但優(yōu)化程序不能將訪問(wèn)計(jì)劃的選擇推遲到運(yùn)行時(shí);它必須在編譯時(shí)進(jìn)行選擇。然而,如果在編譯時(shí)建立訪問(wèn)計(jì)劃,變量的值還是未知的,因而無(wú)法作為索引選擇的輸入項(xiàng)。如下面語(yǔ)句將進(jìn)行全表掃描:
selectidfromtwherenum=@num
可以改為強(qiáng)制查詢(xún)使用索引:
selectidfromtwith(index(索引名))wherenum=@num
8、應(yīng)盡量避免在where子句中對(duì)字段進(jìn)行表達(dá)式操作,這將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描。如:
selectidfromtwherenum/2=100
應(yīng)改為:
selectidfromtwherenum=100*2
9、應(yīng)盡量避免在where子句中對(duì)字段進(jìn)行函數(shù)操作,這將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描。如:
selectidfromtwheresubstring(name,1,3)=’abc’–name以abc開(kāi)頭的id
selectidfromtwheredatediff(day,createdate,’2005-11-30′)=0–’2005-11-30′生成的id
應(yīng)改為:
selectidfromtwherenamelike‘a(chǎn)bc%’
selectidfromtwherecreatedate>=’2005-11-30′andcreatedate<’2005-12-1′
10、不要在where子句中的“=”左邊進(jìn)行函數(shù)、算術(shù)運(yùn)算或其他表達(dá)式運(yùn)算,否則系統(tǒng)將可能無(wú)法正確使用索引。
11、在使用索引字段作為條件時(shí),如果該索引是復(fù)合索引,那么必須使用到該索引中的第一個(gè)字段作為條件時(shí)才能保證系統(tǒng)使用該索引,否則該索引將不會(huì)被使用,并且應(yīng)盡可能的讓字段順序與索引順序相一致。
12、不要寫(xiě)一些沒(méi)有意義的查詢(xún),如需要生成一個(gè)空表結(jié)構(gòu):
selectcol1,col2into#tfromtwhere1=0
這類(lèi)代碼不會(huì)返回任何結(jié)果集,但是會(huì)消耗系統(tǒng)資源的,應(yīng)改成這樣:
createtable#t(…)
13、很多時(shí)候用exists代替in是一個(gè)好的選擇:
selectnumfromawherenumin(selectnumfromb)
用下面的語(yǔ)句替換:
selectnumfromawhereexists(select1frombwherenum=a.num)
14、并不是所有索引對(duì)查詢(xún)都有效,SQL是根據(jù)表中數(shù)據(jù)來(lái)進(jìn)行查詢(xún)優(yōu)化的,當(dāng)索引列有大量數(shù)據(jù)重復(fù)時(shí),SQL查詢(xún)可能不會(huì)去利用索引,如一表中有字段sex,male、female幾乎各一半,那么即使在sex上建了索引也對(duì)查詢(xún)效率起不了作用。
15、索引并不是越多越好,索引固然可以提高相應(yīng)的select的效率,但同時(shí)也降低了insert及update的效率,因?yàn)閕nsert或update時(shí)有可能會(huì)重建索引,所以怎樣建索引需要慎重考慮,視具體情況而定。一個(gè)表的索引數(shù)最好不要超過(guò)6個(gè),若太多則應(yīng)考慮一些不常使用到的列上建的索引是否有必要。
16.應(yīng)盡可能的避免更新clustered索引數(shù)據(jù)列,因?yàn)閏lustered索引數(shù)據(jù)列的順序就是表記錄的物理存儲(chǔ)順序,一旦該列值改變將導(dǎo)致整個(gè)表記錄的順序的調(diào)整,會(huì)耗費(fèi)相當(dāng)大的資源。若應(yīng)用系統(tǒng)需要頻繁更新clustered索引數(shù)據(jù)列,那么需要考慮是否應(yīng)將該索引建為clustered索引。
17、盡量使用數(shù)字型字段,若只含數(shù)值信息的字段盡量不要設(shè)計(jì)為字符型,這會(huì)降低查詢(xún)和連接的性能,并會(huì)增加存儲(chǔ)開(kāi)銷(xiāo)。這是因?yàn)橐嬖谔幚聿樵?xún)和連接時(shí)會(huì)逐個(gè)比較字符串中每一個(gè)字符,而對(duì)于數(shù)字型而言只需要比較一次就夠了。
18、盡可能的使用varchar/nvarchar代替char/nchar,因?yàn)槭紫茸冮L(zhǎng)字段存儲(chǔ)空間小,可以節(jié)省存儲(chǔ)空間,其次對(duì)于查詢(xún)來(lái)說(shuō),在一個(gè)相對(duì)較小的字段內(nèi)搜索效率顯然要高些。
19、任何地方都不要使用select*fromt,用具體的字段列表代替“*”,不要返回用不到的任何字段。
20、盡量使用表變量來(lái)代替臨時(shí)表。如果表變量包含大量數(shù)據(jù),請(qǐng)注意索引非常有限(只有主鍵索引)。
21、避免頻繁創(chuàng)建和刪除臨時(shí)表,以減少系統(tǒng)表資源的消耗。
22、臨時(shí)表并不是不可使用,適當(dāng)?shù)厥褂盟鼈兛梢允鼓承├谈行В纾?dāng)需要重復(fù)引用大型表或常用表中的某個(gè)數(shù)據(jù)集時(shí)。但是,對(duì)于一次性事件,最好使用導(dǎo)出表。
23、在新建臨時(shí)表時(shí),如果一次性插入數(shù)據(jù)量很大,那么可以使用selectinto代替createtable,避免造成大量log,以提高速度;如果數(shù)據(jù)量不大,為了緩和系統(tǒng)表的資源,應(yīng)先createtable,然后insert。
24、如果使用到了臨時(shí)表,在存儲(chǔ)過(guò)程的最后務(wù)必將所有的臨時(shí)表顯式刪除,先truncatetable,然后droptable,這樣可以避免系統(tǒng)表的較長(zhǎng)時(shí)間鎖定。
25、盡量避免使用游標(biāo),因?yàn)橛螛?biāo)的效率較差,如果游標(biāo)操作的數(shù)據(jù)超過(guò)1萬(wàn)行,那么就應(yīng)該考慮改寫(xiě)。
26、使用基于游標(biāo)的方法或臨時(shí)表方法之前,應(yīng)先尋找基于集的解決方案來(lái)解決問(wèn)題,基于集的方法通常更有效。
27、與臨時(shí)表一樣,游標(biāo)并不是不可使用。對(duì)小型數(shù)據(jù)集使用FAST_FORWARD游標(biāo)通常要優(yōu)于其他逐行處理方法,尤其是在必須引用幾個(gè)表才能獲得所需的數(shù)據(jù)時(shí)。在結(jié)果集中包括“合計(jì)”的例程通常要比使用游標(biāo)執(zhí)行的速度快。如果開(kāi)發(fā)時(shí)間允許,基于游標(biāo)的方法和基于集的方法都可以嘗試一下,看哪一種方法的效果更好。
28、在所有的存儲(chǔ)過(guò)程和觸發(fā)器的開(kāi)始處設(shè)置SETNOCOUNTON,在結(jié)束時(shí)設(shè)置SETNOCOUNTOFF。無(wú)需在執(zhí)行存儲(chǔ)過(guò)程和觸發(fā)器的每個(gè)語(yǔ)句后向客戶端發(fā)送DONE_IN_PROC消息。
29、盡量避免向客戶端返回大數(shù)據(jù)量,若數(shù)據(jù)量過(guò)大,應(yīng)該考慮相應(yīng)需求是否合理。
30、盡量避免大事務(wù)操作,提高系統(tǒng)并發(fā)能力。
關(guān)于本次mysql存儲(chǔ)過(guò)程游標(biāo)的使用和簡(jiǎn)述在MySQL中使用游標(biāo)的原因的問(wèn)題分享到這里就結(jié)束了,如果解決了您的問(wèn)題,我們非常高興。
本文鏈接:http://www.resource-tj.com/kaifa/779.html