mysql使用技巧_MySQL使用不得不看的幾個小技巧

程序中寫入的一行行的SQL語句,如果使用了一些優化小技巧,定能達到事半功倍的效果。

1. 優化你的MySQL查詢緩存

在MySQL服務器上進行查詢,可以啟用高速查詢緩存。讓數據庫引擎在后臺悄悄的處理是提高性能的最有效方法之一。當同一個查詢被執行多次時,如果結果是從緩存中提取,就會特別快。

但主要的問題是,它是那么容易被隱藏起來以至于我們大多數程序員會忽略它。在有些處理任務中,我們實際上是可以阻止查詢緩存工作的。

// query cache does NOT work$r = mysql_query("SELECT username FROM user WHERE signup_date >= CURDATE()");// query cache works!$today = date("Y-m-d");$r = mysql_query("SELECT username FROM user WHERE signup_date >= '$today'");// query cache does NOT work$r = mysql_query("SELECT username FROM user WHERE signup_date >= CURDATE()");// query cache works!$today = date("Y-m-d");$r = mysql_query("SELECT username FROM user WHERE signup_date >= '$today'");

2. 用EXPLAIN使你的SELECT查詢更加清晰

使用EXPLAIN關鍵字可以讓你了解MySQL正在進行什么樣的查詢操作,這可以幫助你發現哪里出了問題。EXPLAIN查詢的結果,可以告訴你那些索引正在被引用,表是如何被掃描和排序的等等。

實現一個SELECT查詢(最好是比較復雜的一個,帶joins方式的),在里面添加上你的關鍵詞解釋,在這里我們可以使用phpMyAdmin,他會告訴你表中的結果。舉例來說,假如當我在執行joins時,正忘記往一個索引中添加列,EXPLAIN能幫助我找到問題的所在。

3. 利用LIMIT 1取得唯一行

有時,當你要查詢一張表時,你知道只需要查看一行數據時。你可能會取一條十分獨特的記錄,或者只是剛好檢查了任何存在的記錄數,他們都滿足了你的WHERE子句。

在這種情況下,增加一個LIMIT 1會令你的查詢更加有效。這樣數據庫引擎發現只有1后將停止掃描,而不是去掃描整個表或索引。

4. 索引中的檢索字段

索引不僅是主鍵或唯一鍵。如果你想搜索表中的任何列,你應該一直指向索引。、

5. 保證連接的索引是相同的類型

如果應用程序中包含多個連接查詢,你需要確保你鏈接的列在兩邊的表上都被索引。這會影響MySQL如何優化內部聯接操作。

此外,加入的列,必須是同一類型。例如,你加入一個DECIMAL列,而同時加入另一個表中的int列,MySQL將無法使用其中至少一個指標。即使字符編碼必須同為字符串類型。

6. 不要使用BY RAND()命令

如果您真的需要隨機顯示你的結果,有很多更好的途徑去實現。誠然這需要寫更多的代碼,但是能避免性能瓶頸的出現。問題在于,MySQL可能會為表中每一個獨立的行執行BY RAND()命令(這會消耗處理器的處理能力),然后給你僅僅返回一行。

7. 盡量避免SELECT *命令

從表中讀取越多的數據,查詢會變得更慢。他增加了磁盤需要操作的時間,還是在數據庫服務器與WEB服務器是獨立分開的情況下。你將會經歷非常漫長的網絡延遲,僅僅是因為數據在服務器之間不必要的傳輸。所以指定你需要的列或者字段,這是一個非常良好的習慣。

8. 從PROCEDURE ANALYSE()中獲得建議

PROCEDURE ANALYSE()可讓MySQL的柱結構分析和表中的實際數據來給你一些建議。如果你的表中已經存在實際數據了,能為你的重大決策服務。

9. 使用有準備的語句

準備好的語句,可以從性能優化和安全兩方面對大家有所幫助。

準備好的語句在過濾已經綁定的變量默認情況下,能給應用程序以有效的保護,防止SQL注入攻擊。當然你也可以手動過濾,不過由于大多數程序員健忘的性格,很難達到效果。

10. 為列選擇合適的數據類型

選擇合適數據類型,建立數據表是很重要的。能用TINYINT就不用SMALLINT,能用SMALLINT就不用INT,因為磁盤和內存消耗越小越好。

11. 其他

SQL優化方法有很多種,同樣的查詢結果可以使用很多種不同的查詢方式。其實最好的方法就是在開發環境中用最貼近真實的數據集和硬件環境進行測試,然后再發布到生產環境中。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/540074.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/540074.shtml
英文地址,請注明出處:http://en.pswp.cn/news/540074.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mysql oracle 數據類型轉換_Mysql與Oracle之間的數據類型轉換

[轉]MYSQL 與 Oracle 之間的數據類型轉換

rad linux下安裝mysql_Linux(CentOS或RadHat)下MySQL源碼安裝

MySQL 5.6開始,需要使用g進行編譯。cmake :MySQL 5.5開始,使用cmake進行工程管理,cmake需要2.8以上版本。bison :MySQL語法解析器需要使用bison進行編譯。ncurses-devel :用于終端操作的開發包。zlib …

mysql5.1數據庫亂碼_MySql5.1以上版本中文亂碼的解決方法

在my.cnf內添加以下代碼輸出err日志信息:[safe_mysqld]err-log /var/log/mysqld.logpid-file /var/lib/mysql/localhost.localdomain.pid在shell中輸入/bin/sh /usr/bin/mysqld_safe &啟動mysql,shell輸出如下:110328 11:39:55 mysqld_…

mysql 命令行批量sql_命令行中執行批量SQL的方法

基礎信息介紹測試庫:test;測試表:user;user表定義:CREATE TABLE user (id int(11) NOT NULL AUTO_INCREMENT,name char(30) NOT NULL,age int(11) NOT NULL,gender tinyint(1) DEFAULT 1 COMMENT 性別:1男;…

mysql雙主數據一致性_MySQL雙主一致性架構優化 | 架構師之路-阿里云開發者社區...

一、雙主保證高可用MySQL數據庫集群常使用一主多從,主從同步,讀寫分離的方式來擴充數據庫的讀性能,保證讀庫的高可用,但此時寫庫仍然是單點。在一個MySQL數據庫集群中可以設置兩個主庫,并設置雙向同步,以冗…

spool導出姓名中文亂碼_MySQL不同字符集轉化標準—7步實現,杜絕亂碼!

引言作為資深的DBA程序員,在工作中是否會遇到更這樣的情況呢?原有數據庫的字符集由于前期規劃不足,隨著業務的發展不能滿足業務的需求。如原來業務系統用的是utf8字符集,后期有存儲表情符號的需求,uft8字符集就不能滿足…

appium和airtest_關于Airtest自動化測試工具

一開始知道Airtest大概是在年初的時候,當時,看了一下官方的文檔,大概是類似Sikuli的一個工具,主要用來做游戲自動化的,通過截圖的方式用來解決游戲自動化測試的難題。最近,移動端測試的同事嘗試用它的poco庫…

easyexcel 設置標題_使用easyexcel完成復雜表頭及標題的導出功能(自定義樣式)

如需客戶端指定excel版本,只需要判斷后綴名然后在controller中的.excelType(ExcelTypeEnum.XLS)做指定輸出內容格式即可***(注意表格行高列寬統一設置是在實體類的類名注解上,如果需要對表格進行精細的寬高設置需要刪除掉這兩個注解,可以在攔截器使用row的方法進行設置)1. ## 引…

mysql distinct兩列_正在檢索兩列,并對MySQL中的每列應用“distinct”

這是一張桌子books----------------------------| author_fname | author_lname |----------------------------| Dan | Harris || Freida | Harris || George | Saunders |----------------------------我知道如果DISTINCT用作SELECT DISTINCT author_fname, author_lname FRO…

mysql笛卡爾積 去重_MySQL入門(函數、條件、連接)

MySQL入門(四)distinct:去重mysql>:create table t1(id int,x int,y int);mysql>: insert into t1 values(1, 1, 1), (2, 1, 2), (3, 2, 2), (4, 2, 2);mysql>: select distinct * from t1; # 全部數據mysql>: select distinct x, y from t1; # 結果 1,…

nmon安裝為什么重啟mysql_Nmon的安裝及使用

一、下載Nmon根據CPU的類型選擇下載相應的版本:二、初始化工具[rootmululu ~]# cd /opt[rootmululu opt]# mkdir nmon[rootmululu opt]# cd nmon[rootmululu nmon]#wget http://sourceforge.net/projects/nmon/files/download/nmon_x86_12a.zip[rootmululu nmon]# u…

mysql join 循環_關于mysql聯表的內嵌循環操作nested loop join中on和where執行順序問題...

mysql的理論依據沒找到,個人理解是先執行where的過濾條件,先關聯再過濾明顯做的是無用功。oracle中倒是能在執行計劃中看到,先執行的是過濾條件(下面代碼中最后一行)。explain plan for SELECT * FROM tmp_t2 t2 LEFT JOIN tmp_t1 t1 ON t2.i…

python非法語句是_python 如何優雅的處理大量異常語句?

bs4的鏈式調用很贊,所以我把soup包裝了一下class MY_SOUP():包裝類def __init__(self,soup):self.soup soupif soup:if soup.string:self.string soup.string.strip()else:self.string Noneelse:self.string Nonedef find(self, *args, **kw):ret self.soup.fi…

Iptables詳解+實例

2019獨角獸企業重金招聘Python工程師標準>>> Iptabels是與Linux內核集成的包過濾防火墻系統,幾乎所有的linux發行版本都會包含Iptables的功能。如果 Linux 系統連接到因特網或 LAN、服務器或連接 LAN 和因特網的代理服務器, 則Iptables有利于…

django ipython shell_通過django的shell_plus編寫ipython腳本

Im writing a shell script which runs a command through ipython with the -c option like this:我正在編寫一個shell腳本,它通過ipython運行一個命令,使用-c選項,如下所示:ipython -c "from blah import myfunct; myfunct()"but…

阿里云服務器安裝onlyoffice_阿里云服務器安裝 JDK 8

歡迎關注“科技毒瘤君”&#xff01;上一期給大家分享了如何申請阿里云的免費云服務器&#xff0c;還沒有看過的小伙伴可以先前往了解 >>阿里云免費服務器<<這一次將會為大家分享如何在服務器上配置 Java環境&#xff0c;這里演示使用的系統為Ubuntu 18.04 64位&am…

js發送請求

1.Chrome控制臺中 net::ERR_CONNECTION_REFUSED js頻繁發送請求&#xff0c;有可能連接被拒絕&#xff0c;可用setTimeout&#xff0c;過幾秒發送&#xff0c;給個緩沖時間 var overlayAnalystService L.supermap.spatialAnalystService(serviceUrl); setTimeout(function () …

據說有99%的人都會做錯的面試題

這道題主要考察了面試者對浮點數存儲格式的理解。另外&#xff0c;請不要討論該題本身是否有意義之類的話題。本題只為了測試面試者相關的知識是否掌握&#xff0c;題目本身并沒有實際的意義。 下面有6個浮點類型變量&#xff0c;其中前三個是float類型的&#xff0c;后三個是d…

php使用mysql5和8的區別_mysql8.0和mysql5.7的區別是什么?

區別&#xff1a;mysql8.0的索引可以被隱藏和顯示&#xff0c;當一個索引隱藏時&#xff0c;他不會被查詢優化器所使用&#xff1b;2、mysql8.0新增了“SET PERSIST”命令&#xff1b;3、從mysql8.0開始&#xff0c;數據庫的缺省編碼將改為utf8mb4&#xff0c;包含了所有emoji字…