問題
成都創新互聯公司云計算的互聯網服務提供商,擁有超過13年的服務器租用、內蒙古服務器托管、云服務器、網絡空間、網站系統開發經驗,已先后獲得國家工業和信息化部頒發的互聯網數據中心業務許可證。專業提供云主機、網絡空間、主機域名、VPS主機、云服務器、香港云服務器、免備案服務器等。
我們有一個 SQL,用于找到沒有主鍵 / 唯一鍵的表,但是在 MySQL 5.7 上運行特別慢,怎么辦?
實驗
我們搭建一個 MySQL 5.7 的環境,此處省略搭建步驟。
寫個簡單的腳本,制造一批帶主鍵和不帶主鍵的表:
執行一下腳本:
現在執行以下 SQL 看看效果:
...
執行了 16.80s,感覺是非常慢了。
現在用一下 DBA 三板斧,看看執行計劃:
感覺有點慘,由于 information_schema.columns 是元數據表,沒有必要的統計信息。
那我們來 show warnings 看看 MySQL 改寫后的 SQL:
我們格式化一下 SQL:
可以看到 MySQL 將
select from A where A.x not in (select x from B) //非關聯子查詢
轉換成了
select from A where not exists (select 1 from B where B.x = a.x) //關聯子查詢
如果我們自己是 MySQL,在執行非關聯子查詢時,可以使用很簡單的策略:
select from A where A.x not in (select x from B where ...) //非關聯子查詢:1. 掃描 B 表中的所有記錄,找到滿足條件的記錄,存放在臨時表 C 中,建好索引2. 掃描 A 表中的記錄,與臨時表 C 中的記錄進行比對,直接在索引里比對,
而關聯子查詢就需要循環迭代:
select from A where not exists (select 1 from B where B.x = a.x and ...) //關聯子查詢掃描 A 表的每一條記錄 rA: ? ? 掃描 B 表,找到其中的第一條滿足 rA 條件的記錄。
顯然,關聯子查詢的掃描成本會高于非關聯子查詢。
我們希望 MySQL 能先"緩存"子查詢的結果(緩存這一步叫物化,MATERIALIZATION),但MySQL 認為不緩存更快,我們就需要給予 MySQL 一定指導。
...
可以看到執行時間變成了 0.67s。
整理
我們診斷的關鍵點如下:
\1. 對于 information_schema 中的元數據表,執行計劃不能提供有效信息。
\2. 通過查看 MySQL 改寫后的 SQL,我們猜測了優化器發生了誤判。
\3. 我們增加了 hint,指導 MySQL 正確進行優化判斷。
但目前我們的實驗僅限于猜測,猜中了萬事大吉,猜不中就無法做出好的診斷。
Unknown column 'abc' in 'field list'是參數字段沒有加引號導致的。
代碼語法如下:
參數字段需要添引號update TABLE1 set NAME = '?' where? ID? ='?'
,MySQL常用語法格式:
格式:mysql -h主機地址 -u用戶名 -p用戶密碼
例:連接到本機上的MYSQL
首先在打開DOS窗口,然后進入目錄 mysqlbin,再鍵入命令mysql -uroot -p,回車后提示你輸密碼,如果剛安裝好MYSQL,超級用戶root是沒有密碼的,故直接回車即可進入到MYSQL中了,MYSQL的提示符是:mysql
例:連接到遠程主機上的MYSQL
假設遠程主機的IP為:127.0.0.1,用戶名為root,密碼為1234。則鍵入以下命令:
mysql -h127.0.0.1 -uroot -p1234
注:u與root可以不用加空格,其它也一樣
退出MYSQL命令:exit (回車)
修改密碼
格式:mysqladmin -u用戶名 -p舊密碼 password 新密碼
例:給root加個密碼ab12
首先在DOS下進入目錄mysqlbin,然后鍵入以下命令
你好,當你輸入一些錯誤的指令的時候,可能就會導致后面的指令無法繼續執行,這個時候一般都是因為引號導致的,可以補全雙引號,然后回車,即可結束之前的指令。
還有一種辦法就是強制結束上一條指令,可以通過快捷鍵ctrl+c來執行。
用逗引將關鍵字的字段引起來,insert into tb_test `use` values ('test');逗引就是數字鍵旁邊的那個,在英文輸入法下按下建議:數據庫表的設計避過關鍵字。
如果sql語句中存在關鍵字,可以用反勾號(Esc下面的那個鍵)做轉義;
` 是 MySQL 的轉義符,避免和 mysql 的本身的關鍵字沖突,只要你不在列名、表名中使用 mysql 的保留字或中文,就不需要轉義。
所有的數據庫都有類似的設置,不過mysql用的是`而已。通常用來說明其中的內容是數據庫名、表名、字段名,不是關鍵字。例如:select from from table;
第一個from是字段名,最后的table表名,但是同時也是mysql關鍵字,這樣執行的時候就會報錯,所以應該使用。
標題名稱:mysql里面有怎么辦,mysql常用方法
本文來源:http://vcdvsql.cn/article42/dsiegec.html
成都網站建設公司_創新互聯,為您提供網站收錄、網站改版、云服務器、Google、定制開發、App開發
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯