mysql 查看表是否存在_MySQL优化篇二
單表優化
最佳左前綴原則為,保持索引的定義和使用順序的一致性
將含In的范圍查詢,放到where條件語句的最后。
索引需要逐步優化
兩表優化
小表驅動大表
避免索引失效的一些原則:
復合索引,不要跨列或無序使用(最佳左前綴)
復合索引,盡量使用全索引匹配。就是盡量避免復合索引有三列,而只用到兩列。
復合索引不能使用范圍查詢(!= <>)或is null (is not null),否則自身及右側索引全部失效。
不要對索引進行操作(計算,函數,類型轉換),否則索引失效。
select .. where A.x*3 = ... -- A.x列存在索引,索引失效==注意:SQL優化,是一種概率層次的優化,原因是服務層中有SQL優化器,可能會影響我們的優化,出現與我們預期不符的情況。==
盡量不要使用or,會使左右兩邊索引全部失效。
其他的優化方法
exist 和 in :如果主查詢的數據極大,則使用in,如果子查詢的數據大,則使用exist。
order by :選擇使用單路還是雙路;調整buffer容量的大小;避免使用select *...;復合索引不要跨列使用。
SQL慢查詢日志:
MySQL提供的一種日志記錄,用于記錄MySQL中響應超過閾值的SQL語句(默認是10秒),慢查詢日志默認是關閉的,建議:開發時打開,最終部署時關閉。
- 查看慢查詢日志是否開啟
sql show variables like '%slow_query_log%';
- 臨時開啟慢查詢日志(在內存中開啟),將服務重啟后關閉。
set global slow_query_log = 1;
- 永久開啟慢查詢日志,修改MySQL配置文件
ini [mysqld] ... + slow_query_log = 1 + slow_query_log_file = 日志存放地址
- 查看慢查詢閾值并修改
```sql -- 查看慢查詢閾值時間 show variables like '%long_query_log%'
-- 修改閾值(臨時修改),重新登錄MySQL后生效(不需要重啟服務) set global long_query_time = 5
--修改閾值(永久修改),修改MySQL配置文件,重啟服務生效 [mysqld] ... + long_query_time = 5 ```
- 查詢超過閾值的SQL
sql show global status like '%slow_queries%' -- 當然這種方法只能查看超過閾值的SQL條數,具體的SQL語句還是要通過查看上面設置的慢查詢日志來確定
- 使用mysqldumpslow工具來查詢慢SQL
? 通過查看日志的方式雖然可行,但是當我們的SQL語句多了之后,慢SQL語句也隨之變多,這樣一來查看慢sql日志就成了一件費時費力的事,且日志內容較多,容易造成混亂。使用mysqldumpslow工具可以主動的過濾出我們希望查看的慢SQL語句,比如可以對嗎慢SQL語句進行排序,進行正則匹配,只取10條數據等等。
PROFILES分析海量數據
-- 查看profiles是否開啟 show variables like '%profiling%';查看SQL語句執行的Query_id以及持續時間
show profiles;? 注意: show profiles可以看到profiling打開之后的SQL語句,會顯示ID,持續時間,以及SQL語句,但是我們無法精準的看到各個硬件消費的時間。
查看SQL語句執行的具體硬件消費情況
-- 查看全部信息 show profile all for query Query_id;-- 查看部分信息 show profile cpu, block io for query Query_id;全局查詢日志
全局查看日志會記錄開啟之后的全部SQL語句,因此比較耗費性能。所以我們僅在調優、開發時使用。而且全局查詢日志信息較少,所以使用較少。使用方法
-- 查看是否開啟 show variables like '%general_log%';-- 開啟全局查詢日志 SET GLOBAL general_log = 1; SET GLOBAL log_output='table'; -- 表明我們將SQL存在表里。mysql.general_log表。SET GLOBAL log_output='file'; SET GLOBAL general_log_file='目錄/general.log'; -- 表明將SQL存儲在文件里 SET GLOBAL general_log = 1; -- 如果無效就需要再開啟一下鎖機制
MyISAM只支持表鎖,InnoDB支持表鎖和行鎖
-- 加鎖 lock table 表1 read/write, 表1 read/write...; -- 釋放鎖 unlock tables;-- 查看表加鎖情況 show open tables;讀鎖(共享鎖)
會話1 對 A 表加 讀 鎖
- 會話1:可以讀取A表數據,但不能修改。不可以讀寫其它表數據。
- 其它會話:可以讀取A表數據,如果修改的話必須要等會話1將讀鎖釋放。可以讀寫其它表數據。
| | 會話1 | 其他會話 | | ------ | ---------------- | --------------------------------------- | | A表 | 可以讀,不可以寫 | 可以讀取,想要更新必須等待會話1釋放表鎖 | | 其他表 | 不可以讀寫 | 可以讀寫 |
寫鎖(互斥鎖)
會話1 對 A 表加 寫 鎖
- 會話1:可以對A表進行增刪改查,但是不能操作其他表。
- 其他會話:想要讀寫A表,必須等會話1釋放寫鎖,可以正常操作其他表。
關閉自動提交
-- 以下三種方式都可以 set autocommit=0; start transaction; begin;主從復制
集群和分布式:用板磚來比喻,一開始一個人負責搬磚和運磚,后來工頭嫌他慢,又找了幾個人幫他一起搬磚運磚,這叫集群(多個服務器支持一個項目)。后來工頭還不滿足,就讓一群人專門負責搬磚,另一群人專門負責運磚,這叫分布式(一個項目劃分為幾個部分)。
主從復制大概過程:
總結
以上是生活随笔為你收集整理的mysql 查看表是否存在_MySQL优化篇二的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iphone录屏没内部声音_安卓手机如何
- 下一篇: 不同存储结构的文件磁盘io操作次数_My