日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql 查看表是否存在_MySQL优化篇二

發布時間:2025/3/15 数据库 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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优化篇二的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。