varchar是變長而char的長度是固定的。若是你的內容是固定大小的,你會獲得更好的性能。
DELETE命令從一個表中刪除某一行,或多行,TRUNCATE命令永久地從表中刪除每一行。
觸發器是指一段代碼,當觸發某個事件時,自動執行這些代碼。在MySQL數據庫中有以下六種觸發器:1.Before Insert2.After Insert3.Before Update4.After Update5.Before Delete6.After Delete
int(0)表示數據是INT類型,長度是0、char(16)表示固定長度字符串,長度爲1六、varchar(16)表示可變長度字符串,長度爲1六、datetime表示時間類型、text表示字符串類型,能存儲大字符串,最多存儲65535字節數據)
- InnoDB支持事務,MyISAM不支持;
- InnoDB數據存儲在共享表空間,MyISAM數據存儲在文件中;
- InnoDB支持行級鎖,MyISAM只支持表鎖;
- InnoDB支持崩潰後的恢復,MyISAM不支持;
- InnoDB支持外鍵,MyISAM不支持;
- InnoDB不支持全文索引,MyISAM支持全文索引;
一、插入緩衝(insert buffer)二、二次寫(double write)三、自適應哈希索引(ahi)四、預讀(read ahead)
InnoDB、MyISAM、Memory
- varchar可指定字符數,text不能指定,內部存儲varchar是存入的實際字符數+1個字節(n<=255)或2個字節(n>255),text是實際字符數+2個字節。
- text類型不能有默認值。
- varchar可直接建立索引,text建立索引要指定前多少個字符。varchar查詢速度快於text,在都建立索引的狀況下,text的索引幾乎不起做用。
- 查詢text須要建立臨時表。
最多存放50個字符,varchar(50)和(200)存儲hello所佔空間同樣,但後者在排序時會消耗更多內存,由於order by col採用fixed_length計算col長度(memory引擎也同樣)。
是指顯示字符的長度,不影響內部存儲,只是當定義了ZEROFILL時,前面補多少個 0
- 一個表只能有一個主鍵索引,可是能夠有多個惟一索引。
- 主鍵索引必定是惟一索引,惟一索引不是主鍵索引。
- 主鍵能夠與外鍵構成參照完整性約束,防止數據不一致。
- 聯合索引:將多個列組合在一塊兒建立索引,能夠覆蓋多個列。(也叫複合索引,組合索引)
- 外鍵索引:只有InnoDB類型的表纔可使用外鍵索引,保證數據的一致性、完整性、和實現級聯操做(基本不用)。
- 全文索引:MySQL自帶的全文索引只能用於MyISAM,而且只能對英文進行全文檢索 (基本不用)
需遵循前綴原則
在MySQL裏NULL值的列也是走索引的。固然,若是計劃對列進行索引,就要儘可能避免把它設置爲可空,MySQL難以優化引用了可空列的查詢,它會使索引、索引統計和值更加複雜。
不會,由於只要列涉及到運算,MySQL就不會使用索引。
MyISAM存儲引擎使用B+Tree做爲索引結構,葉節點的data域存放的是數據記錄的地址。MyISAM的索引方式也叫作非聚簇索引的,之因此這麼稱呼是爲了與InnoDB的聚簇索引區分。
- InnoDB索引是聚簇索引,MyISAM索引是非聚簇索引。
- InnoDB的主鍵索引的葉子節點存儲着行數據,所以主鍵索引很是高效。
- MyISAM索引的葉子節點存儲的是行數據地址,須要再尋址一次才能獲得數據。
- InnoDB非主鍵索引的葉子節點存儲的是主鍵和其餘帶索引的列數據,所以查詢時作到覆蓋索引會很是高效。
六種關聯查詢1.交叉鏈接(CROSS JOIN)2.內鏈接(INNER JOIN)3.外鏈接(LEFT JOIN/RIGHT JOIN)4.聯合查詢(UNION與UNION ALL)5.全鏈接(FULL JOIN)6.交叉鏈接(CROSS JOIN)
內鏈接分爲三類面試
- 等值鏈接:ON A.id=B.id
- 不等值鏈接:ON A.id > B.id
- 自鏈接:SELECT * FROM A T1 INNER JOIN A T2 ON T1.id=T2.pid
外鏈接(LEFT JOIN/RIGHT JOIN)sql
- 左外鏈接:LEFT OUTER JOIN, 以左表爲主,先查詢出左表,按照ON後的關聯條件匹配右表,沒有匹配到的用NULL填充,能夠簡寫成LEFT JOIN
- 右外鏈接:RIGHT OUTER JOIN, 以右表爲主,先查詢出右表,按照ON後的關聯條件匹配左表,沒有匹配到的用NULL填充,能夠簡寫成RIGHT JOIN
聯合查詢(UNION與UNION ALL)數據庫
- 就是把多個結果集集中在一塊兒,UNION前的結果爲基準,須要注意的是聯合查詢的列數要相等,相同的記錄行會合並
- 若是使用UNION ALL,不會合並重復的記錄行3.效率 UNION 高於 UNION ALL
全鏈接(FULL JOIN)緩存
1.MySQL不支持全鏈接2.可使用LEFT JOIN 和UNION和RIGHT JOIN聯合使用
嵌套查詢服務器
用一條SQL語句得結果做爲另一條SQL語句得條件,效率很差把握
解題方法函數
根據考題要搞清楚表的結果和多表之間的關係,根據想要的結果思考使用那種關聯方式,一般把要查詢的列先寫出來,而後分析這些列都屬於哪些表,才考慮使用關聯查詢
- 若是使用UNION ALL,不會合並重復的記錄行
- 效率 UNION 高於 UNION ALL
1.若是A表TID是自增加,而且是連續的,B表的ID爲索引工具
2.若是A表的TID不是連續的,那麼就須要使用覆蓋索引.TID要麼是主鍵,要麼是輔助索引,B表ID也須要有索引。性能
考點分析:優化
這道題主要考察的是查找分析SQL語句查詢速度慢的方法
延伸考點:spa
- 優化查詢過程當中的數據訪問
- 優化長難的查詢語句
- 優化特定類型的查詢語句
如何查找查詢速度慢的緣由
記錄慢查詢日誌,分析查詢日誌,不要直接打開慢查詢日誌進行分析,這樣比較浪費時間和精力,可使用pt-query-digest工具進行分析
使用show profile
使用show status
show status會返回一些計數器,show global status會查看全部服務器級別的全部計數有時根據這些計數,能夠推測出哪些操做代價較高或者消耗時間多
show processlist
觀察是否有大量線程處於不正常的狀態或特徵
最常問的MySQL面試題五——每一個開發人員都應該知道
使用explain
分析單條SQL語句
優化查詢過程當中的數據訪問
- 訪問數據太多致使查詢性能降低
- 肯定應用程序是否在檢索大量超過須要的數據,多是太多行或列
- 確認MySQL服務器是否在分析大量沒必要要的數據行
- 避免犯以下SQL語句錯誤
- 查詢不須要的數據。解決辦法:使用limit解決
- 多表關聯返回所有列。解決辦法:指定列名
- 老是返回所有列。解決辦法:避免使用SELECT *
- 重複查詢相同的數據。解決辦法:能夠緩存數據,下次直接讀取緩存
- 是否在掃描額外的記錄。解決辦法:使用explain進行分析,若是發現查詢須要掃描大量的數據,但只返回少數的行,能夠經過以下技巧去優化:
- 使用索引覆蓋掃描,把全部的列都放到索引中,這樣存儲引擎不須要回表獲取對應行就能夠返回結果。
- 改變數據庫和表的結構,修改數據表範式
- 重寫SQL語句,讓優化器能夠以更優的方式執行查詢。
優化長難的查詢語句
- 一個複雜查詢仍是多個簡單查詢
- MySQL內部每秒能掃描內存中上百萬行數據,相比之下,響應數據給客戶端就要慢得多使用盡量小的查詢是好的,可是有時將一個大的查詢分解爲多個小的查詢是頗有必要的。
- 切分查詢
- 將一個大的查詢分爲多個小的相同的查詢
- 一次性刪除1000萬的數據要比一次刪除1萬,暫停一會的方案更加損耗服務器開銷。
- 分解關聯查詢,讓緩存的效率更高。
- 執行單個查詢能夠減小鎖的競爭。
- 在應用層作關聯更容易對數據庫進行拆分。
- 查詢效率會有大幅提高。
- 較少冗餘記錄的查詢。
優化特定類型的查詢語句
- count(*)會忽略全部的列,直接統計全部列數,不要使用count(列名)
- MyISAM中,沒有任何where條件的count(*)很是快。
- 當有where條件時,MyISAM的count統計不必定比其它引擎快。
- 可使用explain查詢近似值,用近似值替代count(*)
- 增長彙總表
- 使用緩存
優化關聯查詢
- 肯定ON或者USING子句中是否有索引。
- 確保GROUP BY和ORDER BY只有一個表中的列,這樣MySQL纔有可能使用索引。
優化子查詢
- 用關聯查詢替代
- 優化GROUP BY和DISTINCT
- 這兩種查詢據可使用索引來優化,是最有效的優化方法
- 關聯查詢中,使用標識列分組的效率更高
- 若是不須要ORDER BY,進行GROUP BY時加ORDER BY NULL,MySQL不會再進行文件排序。
- WITH ROLLUP超級聚合,能夠挪到應用程序處理
優化LIMIT分頁
- LIMIT偏移量大的時候,查詢效率較低
- 能夠記錄上次查詢的最大ID,下次查詢時直接根據該ID來查詢
優化UNION查詢
UNION ALL的效率高於UNION
優化WHERE子句
解題方法對於此類考題,先說明如何定位低效SQL語句,而後根據SQL語句可能低效的緣由作排查,先從索引着手,若是索引沒有問題,考慮以上幾個方面,數據訪問的問題,長難查詢句的問題仍是一些特定類型優化的問題,逐一回答。
1.對查詢進行優化,應儘可能避免全表掃描,首先應考慮在 where 及 order by 涉及的列上創建索引。
2.應儘可能避免在 where 子句中對字段進行 null 值判斷,不然將致使引擎放棄使用索引而進行全表掃描,如:
3.應儘可能避免在 where 子句中使用!=或<>操做符,不然引擎將放棄使用索引而進行全表掃描。
4.應儘可能避免在 where 子句中使用or 來鏈接條件,不然將致使引擎放棄使用索引而進行全表掃描,如:
5.in 和 not in 也要慎用,不然會致使全表掃描,如:
6.下面的查詢也將致使全表掃描:select id from t where name like ‘%李%’若要提升效率,能夠考慮全文檢索。
7.若是在 where 子句中使用參數,也會致使全表掃描。由於SQL只有在運行時纔會解析局部變量,但優化程序不能將訪問計劃的選擇推遲到運行時;它必須在編譯時進行選擇。然 而,若是在編譯時創建訪問計劃,變量的值仍是未知的,於是沒法做爲索引選擇的輸入項。以下面語句將進行全表掃描:
8.應儘可能避免在 where 子句中對字段進行表達式操做,這將致使引擎放棄使用索引而進行全表掃描。如:
9.應儘可能避免在where子句中對字段進行函數操做,這將致使引擎放棄使用索引而進行全表掃描。如:
10.不要在 where 子句中的「=」左邊進行函數、算術運算或其餘表達式運算,不然系統將可能沒法正確使用索引。
但願這些Mysql常見的題可以給在求職路上的你一些幫助,同時也幫你們整理了部分的答案和更多的面試題給你們,但願你們在面試的時候也可以用到。