1. 程式人生 > >java面試(一)Mysql優化

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