Mysql面試知識點總結(基礎篇)

1. SQL 的 select 語句完整的執行順序mysql

一、from 子句組裝來自不一樣數據源的數據,因此爲表建立別名,別的地方能夠用;
二、where 子句基於指定的條件對記錄行進行篩選;
三、group by 子句將數據劃分爲多個分組;
四、使用匯集函數進行計算;    必定要知道他的執行順序在group by後having以前
五、使用 having 子句篩選分組;
六、計算全部的表達式;
七、select 的字段;
八、使用 order by 對結果集進行排序

2. SQL 之鏈接查詢(左鏈接和右鏈接的區別)sql

外鏈接:
    左鏈接(左外鏈接):以左表做爲基準進行查詢,左表數據會所有顯示出來,右表若是和左表匹配的數據則顯示相應字段的數據,若是不匹配則顯示爲 null。
    右鏈接(右外鏈接):以右表做爲基準進行查詢,右表數據會所有顯示出來,左表若是和右表匹配的數據則顯示相應字段的數據,若是不匹配則顯示爲 null。
    全鏈接:先以左表進行左外鏈接,再以右表進行右外鏈接。
內鏈接:
    顯示錶之間有鏈接匹配的全部行。

三、Mysql 性能優化?數據庫

一、當只要一行數據時使用 limit 1查詢時若是已知會獲得一條數據,這種狀況下加上 limit 1 會增長性能。由於 mysql 數據庫引擎會在找到一條結果中止搜索,而不是繼續查詢下一條是否符合標準直到全部記錄查詢完畢。
二、選擇正確的數據庫引擎Mysql 中有兩個引擎 MyISAM 和 InnoDB,每一個引擎有利有弊。
MyISAM 適用於一些大量查詢的應用,但對於有大量寫功能的應用不是很好。甚至你只須要update 一個字段整個表都會被鎖起來。而別的進程就算是讀操做也不行要等到當前 update 操做完成以後才能繼續進行。另外,MyISAM 對於 select count(*)這類操做是超級快的。InnoDB 的趨勢會是一個很是複雜的存儲引擎,對於一些小的應用會比 MyISAM 還慢,可是支持「行鎖」,因此在寫操做比較多的時候會比較優秀。而且,它支持不少的高級應用,例如:事物。
3. 用 not exists 代替 not in/not exists 用到了鏈接可以發揮已經創建好的索引的做用,not in 不能使用索引。Not in 是最慢的方式要同每條記錄比較,在數據量比較大的操做紅不建議使用這種方式。
4. 對操做符的優化,儘可能不採用不利於索引的操做符。如:in /not in /is null /is not null /<> 等
某個字段總要拿來搜索,爲其創建索引:Mysql 中能夠利用 alter table 語句來爲表中的字段添加索引,
語法爲:
    alter table 表名 add index (字段名);
5.分庫分表,主從配置。
6.對於多張大數據量(這裏幾百條就算大了)的表 JOIN,要先分頁再 JOIN,不然邏輯讀會很高,性能不好。
七、存儲過程執行比一條一條地執行其中的各條語句快
八、決不要檢索比需求還要多的數據
十、導入數據前應該關閉自動提交,最好刪除索引而後導入完成後新建
十一、索引改善數據檢索的性能,可是損害了數據插入刪除更新的性能
十二、like很慢,通常來講最好使用fulltext而不是like
1三、若是從一個表中刪除大量數據,應該使用optimize table回收所用的空間,從而優化表性能
1四、char比varchar效率高不少,所以肯定字符長度字段最好使用char字段

四、Mysql 存儲引擎有哪些?安全

(1)、InnoDB 存儲引擎
    InnoDB 是事務型數據庫的首選引擎,支持事務安全表(ACID),支持行鎖定和外鍵,InnoDB 是默認的 MySQL引擎。
(2)、MyISAM 存儲引擎
    MyISAM 基於 ISAM 存儲引擎,並對其進行擴展。它是在 Web、數據倉儲和其餘應用環境下最常使用的存儲引擎之一。MyISAM 擁有較高的插入、查詢速度,但不支持事物。
(3)、MEMORY 存儲引擎
    MEMORY 存儲引擎將表中的數據存儲到內存中,爲查詢和引用其餘表數據提供快速訪問。
(4)、NDB 存儲引擎
    DB 存儲引擎是一個集羣存儲引擎,相似於 Oracle 的 RAC,但它是 Share Nothing 的架構,所以能提供更高級別的高可用性和可擴展性。NDB 的特色是數據所有放在內存中,所以經過主鍵查找很是快。關於 NDB,有一個問題須要注意,它的鏈接(join)操做是在 MySQL 數據庫層完成,不是在存儲引擎層完成,這意味着,複雜的 join 操做須要巨大的網絡開銷,查詢速度會很慢。

五、Mysql經常使用的存儲引擎 InnoDB 對比MyISAM性能優化

InnoDB支持事務和外鍵,有獨立的緩衝池,支持表鎖,不存儲表的總行數,比MyISAM插入效率高

六、事務的四大特徵是什麼?網絡

只要知足一下四個特徵的就屬於事務,事務的四大特性ACID(原子性、一致性、隔離性、持久性)
(1)、原子性:
        事務中整個操做要麼所有完成,要麼所有不完成。
(2)、一致性:
        在事務開始以前和事務結束之後,數據庫的完整性約束沒有被破壞。
(3)、隔離性:
        事務間的操做互不干擾。
(4)、持久性:
        事務一旦完成,就永久保存。
 mysql中關於事務的語句:
        start trunsaction --開啓事務
        savepoint 保留點    --建立保留點(即:還原點)
        rollback to 保留點  --回滾
        commit    --提交
 補充:
        set autocommit=0 --設置mysql不自動提交更改
        release 保留點 釋放保留點

七、where在查詢爲空數據時不能使用==,應該書寫成如下方式架構

select * from tablename where field is null

八、char類型支持的最大字節數是255,text約爲64kb,MEDIUMTEXT約爲16M,LONGTEXT約爲4G
九、查詢時exists適用於b表(在exists或者in中出現的)比A表大的狀況,反之適用in
十、默認狀況下decimal爲10位無小數的整數,在使用過程當中DECIMAL(M,D) ,若是M>D,爲M+2不然爲D+2
十一、SQL分類函數

SQL全程爲Structure Query Language(結構化查詢語言)。SQL 語句主要能夠劃分爲如下 3 個類別:
一、DDL(Data Definition Languages)語句:數據定義語言,這些語句定義了不一樣的數據段、 數據庫、表、列、索引等數據庫對象的定義。經常使用的語句關鍵字主要包括 create、drop、alter 等。
二、DML(Data Manipulation Language)語句:數據操縱語句,用於添加、刪除、更新和查詢數據庫記錄,並檢查數據完整性,經常使用的語句關鍵字主要包括 insert、delete、update 和 select 等。
三、DCL(Data Control Language)語句:數據控制語句,用於控制不一樣數據段直接的許可和 訪問級別的語句。這些語句定義了數據庫、表、字段、用戶的訪問

十二、MySQL數據類型的選擇和優化案例性能

一、手機號存儲
使用BIGINT代替CHAR或者VARCHAR存放手機號碼。
這是由於CHAR或者VARCHAR,佔用空間大,影響查詢性能。
例如:11位手機號CHAR存儲,utf8編碼,則佔用33個字節;
使用若是使用INT的話,INT最大隻能保存10爲數據,而手機號爲11位,會出現溢出,因此使用        BIGINT佔用8個字節,支持11爲數據存儲。
二、IP地址可使用INT存儲
MySQL裏提供了一個很好的函數:INET_ATON(),他負責把IP地址轉化爲數字,而另外一個函數    INET_NTOA()負責將數字轉化爲IP地址,示例以下:注意:INT使用無符號,這是由於INT有符號最大爲2147483647而無符號 最大爲4294967295,若是使用有符號的話,會出現溢出,使用無符號則不會溢出。
三、對於非負整數優先使用無符號整形存儲
四、避免使用enum類型,用TINYINT替代
    修改值必須使用alter、排序的效率比較低、禁止使用數字做爲enum枚舉值
五、使用timestamp(4字節)/datetime(8字節)存儲日期時間
    timestamp日期範圍:1970-1-1 00:00:01----2038-01-10 03:14:07
    timestamp以int存儲,但可讀性高
六、儘量把全部列定義爲not null
    索引null列會佔用更多的空間
    進行比較時須要做額外的處理

1三、如何查看當前數據庫的狀態?大數據

show status;

1四、數據庫報「Too many connections」 怎麼辦?

show full processlist;

1五、如何查看索引是否有效?

在查詢語句前加explain關鍵字,查看type類型是否爲all,是則沒有用到索引,不然使用了索引

1六、group by使用規則

clipboard.png
1七、union/union all使用規則

clipboard.png
1八、視圖的規則和限制

clipboard.png

圖片都來自《Mysql必知必會》

1九、更新時使用update ignore 能夠忽略更新錯誤的行,執行正確更新的數據。
20、一些零碎的知識點

  1. 惟一索引和主鍵索引的區別:惟一索引能夠爲null
  2. 聯接不是物理實體,在實際的數據庫表中不存在,聯結由mysql根據須要創建,它存在於查詢的執行當中。
  3. and優先級高於or,多個or語句時,可以使用in替換的時候必定要使用in語句,執行效率更快
  4. mysql徹底不區分大小寫,使用binary建表的時候在字段後標識能夠區分大小寫,而且使用此函數也能夠在查詢時區分大小寫
  5. 在查詢時distinct關鍵字會應用於全部列而不是前置它的列
  6. or不使用索引
  7. >,<會截斷索引,後面的條件不使用索引
相關文章
相關標籤/搜索