一、鏈接命令mysql
mysql -h$ip -P$port -u$user -p
二、查詢連接狀態sql
數據庫裏面,長鏈接是鏈接成功後,若是客戶端持續有請求,則一直使用同一個連接。數據庫
短鏈接則是指每次執行完不多的幾回查詢就斷開鏈接,下次查詢從新創建一個緩存
創建鏈接的過程一般是比較複雜的,因此我建議你在使用中儘可能減小創建的動做,也就是使用長鏈接bash
可是所有是用長鏈接後,你可能會發現,有些時候MySQL佔用內存漲得特別快,架構
這是由於MySQL在執行過程當中臨時使用的內存管理在鏈接對象裏面的,這些資源會在鏈接斷開的時候才釋放,性能
因此若是長連接積累下來,可能致使內存佔用大,被系統強行殺掉,從現象看就是MySQL異常重啓了優化
一、按期斷開長連接,使用一段時間,或者程序裏面判斷執行過一個佔用內存的大查詢後,斷開鏈接,以後要查詢再鏈接spa
二、若是你用的是MySQL5.7或更新版本,能夠在每次執行一個比較大的操做後,經過執行設計
mysql_reset_connection
來從新初始化鏈接資源,這個過程不須要重連或從新作權限驗證,可是會將鏈接回覆到剛剛建立完時的狀態
一、查詢緩存的失效很是頻繁,只要有一個表更新,這個表上全部的查詢緩存都被清空
二、對於更新壓力大的數據庫來講,查詢緩存的命中率會很是低,
三、除非你的業務就是有一張靜態表,很長時間纔會更新一次(好比一個系統配置表)
MySQL提供的按需使用的方式
query_cache_type 設置成 DEMAND
mysql> select SQL_CACHE * from T where ID=10;
MySQL 8.0 版本直接將查詢緩存的整塊功能刪掉了,也就是說 8.0 開始完全沒有這個功能了。
若是你的語句不對,就會收到「You have an error in your SQL syntax」的錯誤提醒,
好比下面這個語句select 少打了開頭的字母「s」
mysql> elect * from t where ID=1; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to
your MySQL server version for the right syntax to use near 'elect * from t where ID=1' at line 1
通常語法錯誤會提示第一個出現錯誤的位置,因此你要關注的是緊接"use naar"的內容
一、在表裏面有多個索引的時候,決定使用哪一個索引
二、多表關聯(ioin)的時候,決定各個表的連接順序
mysql> select * from t1 join t2 using(ID) where t1.c=10 and t2.d=20;
既能夠先從表 t1 裏面取出 c=10 的記錄的 ID 值,再根據 ID 值關聯到表 t2,再判斷 t2 裏面 d 的值是否等於20
也能夠先從表 t2 裏面取出 d=20 的記錄的 ID 值,再根據 ID 值關聯到 t1,再判斷 t1 裏面 c 的值是否等於10
這兩種執行方法的邏輯結果時同樣的,可是執行的效率會有不一樣,而優化器的做用就是決定選擇哪個方案
一、調用 InnoDB 引擎接口取這個表的第一行,判斷 ID 值是否是1,若是不是則跳過,若是是則將這行存在結果集中
二、調用引擎接口取"下一行",重複相同的判斷邏輯,直到取到這個表的最後一行
三、執行器將上述遍及過程當中全部知足條件的行組成的記錄集做爲結果集返回給客戶端。
第一調用的是"取知足條件的第一行"這個接口,
以後循環取"知足條件的下一行"
引擎掃描行數跟rows_examined並非徹底相同的
若是表 T 中沒有字段 k,而你執行了這個語句 select* from T where k=1, 那確定是會報「不存在這個列」的錯誤:
「Unknown column ‘k’ iin ‘where clause’」。
你以爲這個錯誤是在咱們上面提到的哪一個階段報出來的呢?
做者回復: 「不是執行器」這一點,你分析得很好😄
做者回復: MySQL確實在設計上受Oracle影響頗深。就是這樣哈,分析器作了這個工做。另外有評論裏面舉例高性能MySQL 裏面概念的同窗、說正文裏面已經暗示答案的同窗,遠程點讚了哈😄😄 就喜歡大家這麼機智的回答👍🏿