java面試(一)Mysql優化
一、常用mysql知識
(一)查詢語句優化
1.避免非操作符的使用,NOT、<>資料庫系統不會使用索引。 2.避免對查詢的列的操作,任何對列操作都可能導致全表掃描,包括資料庫函式、技術表示式等。儘可能將操作移至等式右邊 3.避免不必要的型別轉換 4.增加查詢的範圍限制 5.合理使用IN和EXIST 6.儘量去掉<> 7.去掉WHERE字句中的IS NULL和IS NOT NULL,不會使用索引而進行全表搜尋。 8.儘量不要使用前導模糊查詢,前導模糊查詢不能利用索引。 9.SELECT字句中避免使用‘*’ 10.規範所有的SQL關鍵之的書寫,不要大小寫混用
(二) exists與in
1.區別:in是把外表和內表作為hash連線,而exist是對外表做loop迴圈,每次loop迴圈再對內表進行查詢。如果兩個表大小相當,in或exists都可以,如果一大一小,子查詢大表用exists,子查詢小表用in
2.not in 與not exist:如查詢語句使用了not in那麼內外表都進行全表掃描,沒用到索引,而not exists子查詢依然能用到表上索引,所以無論哪個表大,用not exists都比not in要快。
(三) 事物隔離級別
1) 幻讀
事物1讀取一條指定where資料之後,事物2插入一條符合where條件的資料,事物1使用相同條件再次查詢,結果集就可以看到事物2插入的資料,這條資料是幻讀資料
2) 不可重複讀
事物1讀取一條記錄,事物2修改1剛剛讀取的,事物1再次查詢,發現與第一次讀取記錄不同
3) 髒讀
事物1更新一條記錄還沒提交,事物2讀取更新後的資料,然後事物1回滾,事物2讀取的行無效,也就是髒資料。
4) 事務隔離級別
READ UNCOMMITTED 幻讀、不可重複讀和髒讀都允許
READ COMMITTED 允許幻讀、不可重複讀,髒讀不允許
REPEATABLE READ允許幻讀,不允許不可重複讀和髒讀
SERIALIZABLE 幻讀、不可重複讀和髒讀都不允許。
SQL標準所定義的預設事物隔離級別是SERIALIZABLE,但oracle預設使用READ COMMITTED
(四)索引優缺點
優點
建立唯一索引,可以保證資料庫表中每一行資料唯一性
加快資料檢索速度
加速表與表之間連線
減少查詢中分組和排序的時間
在查詢過程中使用優化隱藏器,提高系統性能
缺點
建立索引和維護索引需要耗費時間
索引需要佔物流空間
表中資料增刪改時需要動態維護
不合適的建立索引不會提高效能
主鍵也是一個特殊的所有。資料表中只允許一個主鍵,但是可以有多個索引。
(五)Mysql優化
在MySQL中可以使用EXPLAIN檢視SQL執行計劃
1、引數說明
select_type
1.SIMPLE, 表示簡單查詢,其中不包含連線查詢和子查詢。
2.PRIMARY,表示主查詢,或者是最外面的查詢語句。
3.UNION 表示連線查詢的第2個或後面的查詢語句。
4.DEPENDENT UNION UNION中的第二個或後面的SELECT語句,取決於外面的查詢。
5.UNION RESULT 連線查詢的結果。
6.SUBQUERY 子查詢中的第1個SELECT語句。
7.DEPENDENT SUBQUERY 子查詢中的第1個SELECT語句,取決於外面的查詢。
8.DERIVED SELECT(FROM 子句的子查詢)。
table
表示查詢的表
type
以下引數是最佳型別到最差型別
1.system 表僅有一行,這是const型別的特列,平時不會出現,這個也可以忽略不計。
2.const 資料表最多隻有一個匹配行,因為只匹配一行資料,所以很快,常用於PRIMARY KEY或者UNIQUE索引的查詢,可理解為const是最優化的
3.eq_ref 對於每個來自於前面的表的行組合,從該表中讀取一行。這可能是最好的聯接型別,除了const型別。它用在一個索引的所有部分被聯接使用並且索引是UNIQUE或PRIMARY KEY”。eq_ref可以用於使用=比較帶索引的列
4.ref 查詢條件索引既不是UNIQUE也不是PRIMARY KEY的情況。ref可用於=或<或>操作符的帶索引的列。
5.ref_or_null 該聯接型別如同ref,但是添加了MySQL可以專門搜尋包含NULL值的行。在解決子查詢中經常使用該聯接型別的優化。
以上5種情況都是很理想的索引使用情況
6.index_merge 該聯接型別表示使用了索引合併優化方法。在這種情況下,key列包含了使用的索引的清單,key_len包含了使用的索引的最長的關鍵元素
7.unique_subquery 是一個索引查詢函式,可以完全替換子查詢,效率更高
8.index_subquery 可以替換IN子查詢,但只適合下列形式的子查詢中的非唯一索引value IN (SELECT key_column FROM single_table WHERE some_expr)
9.range 只檢索給定範圍的行,使用一個索引來選擇行。
10.index 該聯接型別與ALL相同,除了只有索引樹被掃描。這通常比ALL快,因為索引檔案通常比資料檔案小。
11.ALL 對於每個來自於先前的表的行組合,進行完整的表掃描
possible_keys
指出MySQL能使用哪個索引在該表中找到行。如果該列為NULL,說明沒有使用索引,可以對該列建立索引來提高效能。
key
顯示MySQL實際決定使用的鍵(索引)。如果沒有選擇索引,鍵是NULL
可以強制使用索引或者忽略索引:IGNORE INDEX(age).USE INDEX(age)
key_len
顯示MySQL決定使用的鍵長度。如果鍵是NULL,則長度為NULL。
注意:key_len是確定了MySQL將實際使用的索引長度。
ref
顯示使用哪個列或常數與key一起從表中選擇行
rows
顯示MySQL認為它執行查詢時必須檢查的行數。
Extra
該列包含MySQL解決查詢的詳細資訊
2、使用索引查詢需要注意
使用LIKE關鍵字的查詢
1.在使用LIKE關鍵字進行查詢的查詢語句中,如果匹配字串的第一個字元為“%”,索引不起作用。只有“%”不在第一個位置,索引才會生效
使用聯合索引的查詢
MySQL可以為多個欄位建立索引,一個索引可以包括16個欄位。對於聯合索引,只有查詢條件中使用了這些欄位中第一個欄位時,索引才會生效。
使用OR關鍵字的查詢
查詢語句的查詢條件中只有OR關鍵字,且OR前後的兩個條件中的列都是索引時,索引才會生效,否則,索引不生效
子查詢優化
執行子查詢時,MYSQL需要建立臨時表,查詢完畢後再刪除這些臨時表,所以,子查詢的速度會受到一定的影響。可以使用連線查詢(JOIN)代替子查詢,連線查詢時不需要建立臨時表,其速度比子查詢快。
3、資料庫結構優化
將欄位很多的表分解成多個表
對於欄位較多的表,如果有些欄位的使用頻率很低,可以將這些欄位分離出來形成新表。
因為當一個表的資料量很大時,會由於使用頻率低的欄位的存在而變慢。
增加中間表
對於需要經常聯合查詢的表,可以建立中間表以提高查詢效率。通過建立中間表,將需要通過聯合查詢的資料插入到中間表中,然後將原來的聯合查詢改為對中間表的查詢。
增加冗餘欄位
設計資料表時應儘量遵循正規化理論的規約,儘可能的減少冗餘欄位,讓資料庫設計看起來精緻、優雅。但是,合理的加入冗餘欄位可以提高查詢速度。表的規範化程度越高,表和表之間的關係越多,需要連線查詢的情況也就越多,效能也就越差。
注意:冗餘欄位的值在一個表中修改了,就要想辦法在其他表中更新,否則就會導致資料不一致的問題
4、插入資料的優化
插入資料時,影響插入速度的主要是索引、唯一性校驗、一次插入的資料條數等
MySQL中常用的儲存引擎有,MyISAM和InnoDB兩者的區別:
MyISAM 是非事務安全型的,InnoDB事務安全型的。
MyISAM鎖粒度是表級 ,InnoDB支援行級。
MyISAM支援全文型別索引 ,InnoDB不支援全文索引。
MyISAM 相對簡單,效率上優於InnoDB,小型系統考慮使用
MyISAM表是報錯成檔案的形式 ,跨平臺的資料轉移中使用會省去不少麻煩
MyISAM ,InnoDB更加安全,保證資料不會丟失的情況下,切換非事務表到事物表。
MyISAM管理非事務,如果應用中需要執行大量SELECT查詢,那麼更好的選擇是MYISAM ,InnoDB用於事物處理應用程式,具有眾多性,包括ACID,如應用中需要執行大量的INSERT或UPDATE操作,則應使用INNoDB
MyISAM
禁用索引,禁用唯一性檢查,批量插入資料。當需要批量匯入資料時,使用LOAD DATA INFILE語句比INSERT語句插入速度快很多
InnoDB
禁用唯一性檢查,禁用外來鍵檢查,禁止自動提交
(七) 伺服器優化
1、優化伺服器硬體
主要通過使用高效能硬體裝置提高效率
2、優化MySQL的引數
MySQL的配置引數都在my.conf或者my.ini檔案的[mysqld]組中
key_buffer_size:表示索引緩衝區的大小
table_cache:表示同時開啟的表的個數
query_cache_size:表示查詢緩衝區的大小
sort_buffer_size 表示排序快取區的大小
read_buffer_size:表示每個執行緒連續掃描時為掃描每個表分配的緩衝區的大小
read_rnd_buffer_size:表示為每個執行緒保留的緩衝區的大小
innodb_buffer_pool_size:表示InnoDB型別的表和索引的最大快取
max_connections:表示資料庫的最大連線數
innodb_flush_log_at_trx_commit:表示何時將緩衝區的資料寫入日誌檔案
back_log:表示在mysql暫時停止回答新請求之前的短時間內,多少個請求可以放在堆疊中。
interactive_timeout:表示伺服器在關閉連線前等待行動的秒數。
sort_buffer_size: 表示每個需要進行排序的執行緒分配的緩衝區的大小。
thread_cache_size 表示可以複用的執行緒的數量
wait_timeout 表示伺服器在關閉一個連線時等待行動的秒數。預設數值時28800
相關推薦
java面試(一)Mysql優化
一、常用mysql知識 (一)查詢語句優化 1.避免非操作符的使用,NOT、<>資料庫系統不會使用索引。 2.避免對查詢的列的操作,任何對列操作都可能導致全表掃描,包括資料庫函式、技術表示式等。儘可能將操作移至等式右邊 3.避免不必要的型
一.mysql優化
並且 網絡優化 聯合 適用場景 哪些 uniq -- res ini 一.mysql優化 1.網站請求走向分析優化的方面 需要優化的地方: a:網絡優化,服務器硬件方面,CDN加速(訪問離用戶最近一臺服務器獲取資源文件(jquery,js)) b:頁面靜態化處理,訪問速
[Java面試一]面試復習大綱.
off ber 筆試題 筆試 機試 工作流程 如果 mybatis 用途 一、Java基礎部分 (搞定所有技術之後才考慮復習的技術點) 1.數組中的排序問題(筆試或者機試,前者可能性更大) 2.面向對象的理解 3.集合相關的問題,比如hashmap
java 面試 一 (java知音轉)
1、Spring DAO 中最常用的類是() A,JdbcTemplate ,SimpleJdbcTemplate B,SimpleJdbcInsert,SimpleJdbcProcedure C,SimpleJdbcInsert ,SimpleJdbcStoredProc D,Si
[Java面試一]面試複習大綱
一、Java基礎部分 (搞定所有技術之後才考慮複習的技術點) 1.陣列中的排序問題(筆試或者機試,前者可能性更大) 2.面向物件的理解 3.集合相關的問題,比如hashmap跟hashtable的區別。搞清楚每個集合物件的特性就歐了。 4.多執行緒啟動
[Java面試一]面試複習大綱.
[Java面試一]面試複習大綱. 一、Java基礎部分 (搞定所有技術之後才考慮複習的技術點) 1.陣列中的排序問題(筆試或者機試,前者可能性更大) 2.面向物件的理解
Java面試準備十六:資料庫——MySQL效能優化
這裡只是為了記錄,由於自身水平實在不怎麼樣,難免錯誤百出,有錯的地方還望大家多多指出,謝謝。 1. 為查詢快取優化你的查詢 大多數的MySQL伺服器都開啟了查詢快取。這是提高性最有效的方法之一,而且這是被MySQL的資料庫引擎處理的。當有很多相同的查
【JAVA秒會技術之玩轉SQL】MySQL優化技術(一)
MySQL優化技術(一) 開發的路上,總會碰到一些老系統,越用越慢。“慢”的原因也許有很多,但是,博主個人覺得,資料庫的設計和sql語句寫的好壞,對系統效率的影響是最直接,最顯而易見的!所以,學習一下MySQL的優化,還是很有必要的。當然,博主能力有限,沒那
【JAVA秒會技術之秒殺面試官】秒殺Java面試官——集合篇(一)
tails category tail java cat 秒殺 試題 面試官 java面試 【JAVA秒會技術之秒殺面試官】秒殺Java面試官——集合篇(一) 【JAVA秒會技術之秒殺面試官】JavaEE常見面試題(三) http://blog.csdn.net/qq296
JAVA面試必備的知識寶典(一)
java相關概念面向對象的三個特征封裝,繼承,多態.這個應該是人人皆知.有時候也會加上抽象.多態的好處允許不同類對象對同一消息做出響應,即同一消息可以根據發送對象的不同而采用多種不同的行為方式(發送消息就是函數調用).主要有以下優點:可替換性:多態對已存在代碼具有可替換性.可擴充性:增加新的子類不影響已經存在
Java面試-數據庫篇(一)
t對象 計時 具體類 分離 根據 變化 第二範式 類加載 關系 1、用兩種方式根據部門號從高到低,工資從低到高列出每個員工的信息。 1 employee: 2 3 eid,ename,salary,deptid; 4 5 select * from employeeo
「mysql優化專題」90%程序員面試都用得上的索引優化手冊(5)
根據 eat index 重要 進行 需要 範圍查詢 記錄 文件的 目錄(技術文) 多關於索引,分為以下幾點來講解: 一、索引的概述(什麽是索引,索引的優缺點) 二、索引的基本使用(創建索引) 三、索引的基本原理(面試重點) 四、索引的數據結構(B樹,hash) 五、創建索
「mysql優化專題」這大概是一篇最好的mysql優化入門文章(1)
left 機械 增刪改查 靜態 命中 mysql查詢 關註 mysq 增刪改 優化,一直是面試最常問的一個問題。因為從優化的角度,優化的思路,完全可以看出一個人的技術積累。那麽,關於系統優化,假設這麽個場景,用戶反映系統太卡(其實就是高並發),那麽我們怎麽優化? 如果請
(一)java面試易忘題目精選(上)
參數 原理 error erro style num hello 用戶登錄 pri 1. int和Integer有什麽區別? 答:Java是一個近乎純潔的面向對象編程語言,但是為了編程的方便還是引入了基本數據類型,但是為了能夠將這些基本數據類型當成對象操作,Java為
面試問題 | MySQL 修改哪些配置文件可以進行優化?
packet 內多 web服務 raid myisam 內容 這一 但是 pack 本文轉載自ITPUB公眾號 配置文件中具體修改的內容是什麽呢?要是面試官問你,你該怎麽回答?你想下,你坐在一間屋子裏。 服務器的 MySQL性能優化,有兩個大致的方向考慮,第一個是服務器
【java面試寶典】一年工作經驗
排序 servlet 局部變量 列表 註入 put 回收 post 屬性獲取 時光轉瞬即逝,一年時間已經過去,自己準備跳槽了,請了幾天假,面試了幾家公司之後,拿到了一份offer,有了一點兒小小的心得,記錄下來分享給搞Java的朋友,面試主要是幾個部分內容。 很多公司會要
Java 面試基礎總結(一)
tor rac 時有 線程安全 lec getclass ron 接口 add 1、九種基本數據類型的大小以及它們的封裝類 java提供的九種基本數據類型:boolean、byte(1)、char(2)、short(2)、int(4)、long(8)、float(4)、do
Java學習之Mysql結構優化
故障 新增 數據讀取 承載 思路 中間變量 請求 進一步 其他 背景:業務發展初期為了便於快速叠代,很多應用都采用集中式的架構,隨著業務規模的擴展,系統變得越來越復雜,訪問量越來越大,不得不進一步擴展系統的吞吐能力。 優化1、主從集群:通過數據庫的復制策略,可
萬字總結:學習MySQL優化原理,這一篇就夠了!
ade min() 全表掃描 搜索 財務 兼容 嵌套循環 很大的 完成 前言 說起MySQL的查詢優化,相信大家收藏了一堆奇技淫巧:不能使用SELECT *、不使用NULL字段、合理創建索引、為字段選擇合適的數據類型..... 你是否真的理解這些優化技巧?是否理解其背後的工
JAVA高級開發面試一(ZX)
正則表達式 算法 con 類圖 person 筆試 靜態 字母數 字符 筆試: 1、正則表達式,第一個字符為字母其他為字母數字下劃線,最大長度為5-20範圍內;^[a-zA-Z]\w{4,19} 2、代碼塊加載順序;父靜態屬性->父靜態代碼塊->子靜態屬性-&g