<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
#連線MySQL mysql -h 127.0.0.1 -u UserName -p pwd -P 3306 #建立新使用者 CREATE USER 'username'@'host' IDENTIFIED BY 'password'; #賦許可權,%表示所有(host): grant all privileges on *.* to 'username'@'%'; #修改密碼 update user set password=password("123456") where user='root'; #檢視當前使用者的許可權 show grants for root@"%"; #顯示所有資料庫 show databases; #開啟資料庫 use dbname; #檢視庫中有哪些表 show tables #顯示錶mysql資料庫中user表的列資訊) describe user #檢視連線(包括使用者、正在執行的操作、狀態等) show processlist #重新整理連線 flush privileges #關閉某連線 kill id #查詢庫中所有的表 select * from information_schema.tables where table_schema='zhebase'; #查詢表資訊(欄位,欄位型別,是否為空,編碼,備註等) select * from information_schema.columns where table_schema='zhebase' and table_name='student_inndb'; #檢視MySQL許可權 Host列表示那個Ip可以連線,User表示使用者,後面的欄位是許可權 select * from mysql.user; #檢視全域性伺服器關閉非互動連線之前等待活動的秒數 show global variables like "wait_timeout"; #設定全域性伺服器關閉非互動連線之前等待活動的秒數(預設8小時不傳送命令自動斷連) set global wait_timeout=28800;
開發當中我們大多數時候用的都是長連線,把連線放在 Pool 內進行管理,但是長連線有時候會導致 MySQL 佔用記憶體飆升,這是因為 MySQL 在執行過程中臨時使用的記憶體是管理在連線物件裡面的。這些資源會在連線斷開的時候才釋放。所以如果長連線累積下來,可能導致記憶體佔用太大,被系統強行殺掉(OOM),從現象看就是 MySQL 異常重啟了。 怎麼解決這類問題呢? 1、定期斷開長連線。 使用一段時間,或者程式裡面判斷執行過一個佔用記憶體的大查詢後,斷開連線,之後要查詢再重連。 2、如果你用的是 MySQL 5.7 或更新版本,可以在每次執行一個比較大的操作後,通過執行 mysql_reset_connection 來重新初始化連線資源。 這個過程不需要重連和重新做許可權驗證,但是會將連線恢復到剛剛建立完時的狀態。
為什麼說MySQL查詢快取是否雞肋?
#my.cnf組態檔中,一般將my.cnf引數 query_cache_type 設定成 DEMAND query_cache_type有3個值 0代表關閉查詢快取OFF,1代表開啟ON,2(DEMAND)代表當sql語句中有SQL_CACHE 關鍵詞時才快取
連線MySQL的過程:
工作過程:
詞法分析器分成6個主要步驟完成對sql語句的分析 1、詞法分析 2、語法分析 3、語意分析 4、構造執行樹 5、生成執行計劃 6、計劃的執行
舉例:
Select EMPLOYEE.Name , WELFARE.Bonus From EMPLOYEE , WELFARE Where EMPLOYEE.Seniority > 5 And EMPLOYEE.Seniority = WELFARE.Seniority ; Select EMPLOYEE.Name , WELFARE.Bonus From EMPLOYEE , WELFARE Where EMPLOYEE.Seniority > 5 And EMPLOYEE.Seniority = WELFARE.Seniority And EMPLOYEE.Seniority > 5;
查詢重寫: 因為第一條將EMPLOYEE中Seniority > 5 的行與 WELFARE 中的所有行作外連線再來找 Seniority 相等的行,而第二條則是將 EMPLOYEE 中 Seniority > 5 的行和 WELFARE 中 Seniority > 5 的行作外連線再來找 Seniority 相等的行,第二條語句只有更少的行參與外連線,效率更高。寫 SQL 時查詢優化器自動重寫。
(7) SELECT (8) DISTINCT <select_list> (1) FROM <left_table> (3) <join_type> JOIN <right_table> (2) ON <join_condition> (4) WHERE <where_condition> (5) GROUP <group_by_list> (6) HAVING <having_condition> (9) ORDER BY <order_by_list> (10) LIMIT <limit_number>
在設計表時,選擇資料型別時一般先確定大的型別(數位,字串,時間,二進位制),然後再根據有無符號、取值範圍、是否定長等確定具體的資料型別。在設計時,儘量使用更小的資料型別以達到更優的效能。並且在定義時儘量使用 NOT NULL,避免 NULL 值。
首先了解:
型別 | 大小 | 範圍(有符號) | 範圍(無符號) | 用途 |
---|---|---|---|---|
TINYINT | 1 位元組 | [27,27-1] | [0,28-1] | 小整數值 |
SMALLINT | 2 位元組 | [215,215-1] | [0,216-1] | 大整數值 |
MEDIUMINT | 3 位元組 | [223,223-1] | [0,224-1] | 大整數值 |
INT/INTEGER | 4 位元組 | [231,231-1] | [0,232-1] | 大整數值 |
BIGINT | 8 位元組 | [263,263-1] | [0,264-1] | 極大整數值 |
FLOAT | 4 位元組 | 約-3.40E+38 ~ 3.40E+38 | 約0~3.40E+38 | 單精度浮點數值 |
DOUBLE | 8 位元組 | 約1.7E-308~1.7E+308 | 約0~1.7E+308 | 雙精度浮點數值 |
DECIMAL | DECIMAL(M,D) | 依賴於M和D的值 | 依賴於M和D的值 | 小數值 |
建議:
建議:
型別 | 大小 | 用途 |
---|---|---|
CHAR | 0-255位元組 | 定長字串,char(n)當插入的字串實際長度不足n時, 插入空格進行補充儲存。在進行檢索時,尾部的空格會被去掉。 |
VARCHAR | 0-65535 位元組 | 變長字串,varchar(n)中的n代表最大列長度,插入的字串實際長度不足n時不會補充空格 |
TINYBLOB | 0-255位元組 | 不超過 255 個字元的二進位制字串 |
TINYTEXT | 0-255位元組 | 短文字字串 |
BLOB | 0-65535位元組 | 二進位制形式的長文字資料 |
TEXT | 0-65535位元組 | 長文字資料 |
MEDIUMBLOB | 0-16777215位元組 | 二進位制形式的中等長度文字資料 |
MEDIUMTEXT | 0-16777215位元組 | 中等長度文字資料 |
LONGBLOB | 0-4 294967295位元組 | 二進位制形式的極大文字資料 |
LONGTEXT | 0-4 294967295位元組 | 極大文字資料 |
建議
減少存取量: 資料存取是資料庫系統最核心功能,所以 IO 是資料庫系統中最容易出現效能瓶頸,減少 SQL 存取 IO 量是 SQL 優化的第一步;資料塊的邏輯讀也是產生CPU開銷的因素之一。
減少計算操作: 計算操作進行優化也是SQL優化的重要方向。SQL 中排序、分組、多表連線操作等計算操作都是十分消耗 CPU 的。
type列,連線型別。一個好的SQL語句至少要達到range級別。杜絕出現all級別。
key列,使用到的索引名。如果沒有選擇索引,值是NULL。 key_len列,索引長度。 rows列,掃描行數。該值是預估值。 extra列,詳細說明。注意,常見的不太友好的值,如下:Using filesort,Using temporary。
SELECT * 增加很多不必要的消耗(CPU、IO、記憶體、網路頻寬) 直接使用select欄位名稱還增加了使用覆蓋索引的可能性
select id,name from customer limit 100000, 10 //查詢從十萬條開始的20條資料
上述程式碼,隨著分頁的後移,效率越來越慢,優化方法如下:可以取上一頁的最大行數的 id(前提是ID 遞增,且非聯合主鍵,一般不建議設定聯合主鍵,主鍵前面都可以加上ID作為主鍵),然後根據這個最大的 ID 來限制下一頁的起點。或者通過索引查 id,在通過id查詢出資料
select * from A where id in (select id from B) select * from A where exists(select id from B where id=A.id)
in先執行子查詢再執行主查詢,exits先執行主查詢再執行子查詢。如果子查詢得出的結果集記錄較少,主查詢中的表較大且又有索引時應該用in反之如果外層的主查詢記錄較少,子查詢中的表大,又有索引時使用exists
原則:小表驅動大表
如果查詢語句使用了 not in 那麼內外表都會放棄索引進行全表掃描;而 not extsts 的子查詢依然能用到表上的索引。所以 not exists 都比 not in 要快。也可以使用一些方法轉換邏輯來進行優化
//原SQL語句: select name from A where A.id not in (select B.id from B) //優化後的SQL語句: select name from A Left join B on where A.id = A.id where B.id is null
當 where 條件和 order by 排序欄位不匹配時,即使where條件中用到了索引,但執行 order by 時仍然會進行全表掃描(索引只能生效一個,且遵循最左匹配原則);order by後的索引生效時(索引本質是倒排表)效率會得到極大的提升。
select a,b,c from customer where a = 'xxx' and b = 'xxx' order by c;
使用like '%name%'或者like '%name'會導致索引失效而導致全表掃描。但使用like 'name%'不會。
解決方法:
注意: 1.全文索引的儲存引擎一定是Myisam,InnoDB沒有全文索引 2.全文索引對中文不太友好
//建立全文索引 ALTER TABLE cust ADD FULLTEXT INDEX idx_cust_address ('cust_address'); //使用全文索引 select name from cust where match(cust_address) against('湖南');
倒排索引是一種索引資料結構:從文字資料內容中提取出不重複的單詞進行分詞,每1個單詞對應1個ID對單詞進行區分,還對應1個該單詞在那些檔案中出現的列表 把這些資訊組建成索引。倒排索引還記錄了該單詞在檔案中出現位置、頻率(次數/TF)用於快速定位檔案和對搜素結果進行排序。
對於聯合索引來說,如果存在範圍查詢,比如between、>、<等條件時,會造成後面的索引欄位失效
對於null的判斷以及!=和<>會導致引擎放棄使用索引而進行全表掃描。
儘量使用union all或者是union方式來代替or。 union和union all的區別主要是union需要將結果集合並後再進行過濾操作過濾掉重複資料,這就會涉及到排序,增加大量的CPU運算,加大資源消耗及延遲。使用union all的前提條件是兩個結果集沒有重複資料。
可以使EXPLAIN中type列達到const型別
在一些使用者選擇頁面中,可能一些使用者選擇的時間範圍過大,造成查詢緩慢。主要的原因是掃描行數過多。這個時候可以通過程式,分段進行查詢,迴圈遍歷,將結果合併處理進行展示。
應避免在where子句中對欄位進行函數等操作,這將導致引擎放棄使用索引而進行全表掃描。
//原SQL select id,name from customer where salary/2 > 5000; //優化後 select id,name from customer where salary > 5000*2;
參與聯合查詢的表至少為2張表,一般都存在大小之分。如果連線方式是inner join,在沒有其他過濾條件的情況下,MySQL會自動選擇小表作為驅動表,但是left join在驅動表的選擇上遵循的是左邊驅動右邊的原則,即left join左邊的表名為驅動表。
MySQL對於IN做了相應的優化,即將IN中的常數全部儲存在一個陣列裡面,而且這個陣列是排好序的。但是如果數值較多,產生的消耗也是比較大的。再例如:select id from t where num in(1,2,3) 對於連續的數值,能用between就不要用in了。或者使用連線來替換。
到此這篇關於MySQL常用命令與內部元件及SQL優化詳情的文章就介紹到這了,更多相關MySQL優化內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45