資料庫相關知識點

2021-10-23 17:11:37 字數 2874 閱讀 7117

mysql的引擎有innodb和myisam兩種,預設是innodb;

索引實現方式主要有兩種:b+樹和hash;

事務:原子性、一致性、永續性、隔離性;三種問題(髒讀、不可重複讀、幻讀);對應四種隔離級別(讀未提交、讀已提交、可重讀、序列化)。

優化方式:主要讓查詢的字段都被索引覆蓋,避免全表查詢;

(1)b+樹

a.它不僅可以被用在=,>,>=,<,<=和between這些比較操作符上,而且還可以用於like操作符,只要它的查詢條件是乙個不以萬用字元開頭的常量。

-- 如果一萬用字元開頭,或者沒有使用常量,則不會使用索引,例如: 

select * from user where name like '%jack';

hash索引只能用於對等比較,但是檢索效率遠高於btree索引。

(2)索引的建立原則:(寫查詢語句的時候也要注意)

索引雖好,但也不是無限制的使用,最好符合一下幾個原則

1) 最左字首匹配原則,組合索引非常重要的原則,mysql會一直向右匹配直到遇到範圍查詢(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)順序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引則都可以用到,a,b,d的順序可以任意調整。

2)較頻繁作為查詢條件的字段才去建立索引

3)更新頻繁欄位不適合建立索引

4)若是不能有效區分資料的列不適合做索引列(如性別,男女未知,最多也就三種,區分度實在太低),對取值離散度大的字段建立索引;

5)盡量的擴充套件索引,不要新建索引。比如表中已經有a的索引,現在要加(a,b)的索引,那麼只需要修改原來的索引即可。

6)定義有外來鍵的資料列一定要建立索引。

7)對於那些查詢中很少涉及的列,重複值比較多的列不要建立索引。

8)對於定義為text、image和bit的資料型別的列不要建立索引,索引字段越小越好。

所以我們想要刪除百萬資料的時候可以先刪除索引(此時大概耗時三分多鐘)

然後刪除其中無用資料(此過程需要不到兩分鐘)

刪除完成後重新建立索引(此時資料較少了)建立索引也非常快,約十分鐘左右。

與之前的直接刪除絕對是要快速很多,更別說萬一刪除中斷,一切刪除會回滾。那更是坑了。

mysql會一直向右匹配直到遇到範圍查詢(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)順序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引則都可以用到,a,b,d的順序可以任意調整。

hash索引進行等值查詢更快(一般情況下),但是卻無法進行範圍查詢。

hash索引不支援使用索引進行排序,不支援模糊查詢以及多列索引的最左字首匹配。

hash索引任何時候都避免不了回表查詢資料,而b+樹在符合某些條件(聚簇索引,覆蓋索引等)的時候可以只通過索引完成查詢。

hash索引雖然在等值查詢上較快,但是不穩定。效能不可**,當某個鍵值存在大量重複的時候,發生hash碰撞,此時效率可能極差。而b+樹的查詢效率比較穩定,對於所有的查詢都是從根節點到葉子節點,且樹的高度較低。

b樹只適合隨機檢索,而b+樹同時支援隨機檢索和順序檢索;

b+樹空間利用率更高,可減少i/o次數,磁碟讀寫代價更低。

在資料庫中基於範圍的查詢是非常頻繁的,而b樹不支援這樣的操作。

增刪檔案(節點)時,效率更高。因為b+樹的葉子節點包含所有關鍵字,並以有序的鍊錶結構儲存,這樣可很好提高增刪效率。

not null: 用於控制欄位的內容一定不能為空(null)。

unique: 控制項字段內容不能重複,乙個表允許有多個 unique 約束。

primary key: 也是用於控制項字段內容不能重複,但它在乙個表只允許出現乙個。

foreign key: 用於預防破壞表之間連線的動作,也能防止非法資料插入外來鍵列,因為它必須是它指向的那個表中的值之一。

check: 用於控制欄位的值範圍。

資料型別

q1:字元和位元組?

位元組(byte)是計量單位,表示資料量多少,是計算機資訊技術用於計量儲存容量的一種計量單位,通常情況下一位元組等於八位。

字元(character)計算機中使用的字母、數字、字和符號,比如'a'、'b'、'$'、'&'等。

一般在英文狀態下乙個字母或字元占用乙個位元組,乙個漢字用兩個位元組表示。

mysql提供了explain命令來檢視語句的執行計畫,其中包含了是否使用索引,使用什麼索引,使用的索引的相關資訊等

開啟慢查詢日誌

配置項:slow_query_log = on

設定臨界時間

配置項:long_query_time

慢查詢的優化首先要搞明白慢的原因是什麼? 是查詢條件沒有命中索引?是load了不需要的資料列?還是資料量太大?

應盡量避免在 where 子句中對字段進行 null 值判斷;應盡量避免在 where 子句中使用!=或<>操作符;應盡量避免在 where 子句中使用or 來連線條件;應盡量避免在 where 子句中對字段進行表示式/函式操作,否則引擎將放棄使用索引而進行全表掃瞄。

對於連續的數值,能用 between 就不要用 in 了:

限定資料的範圍:務必禁止不帶任何限制資料範圍條件的查詢語句。比如:我們當使用者在查詢訂單歷史的時候,我們可以控制在乙個月的範圍內。;

讀/寫分離:經典的資料庫拆分方案,主庫負責寫,從庫負責讀;

快取:使用mysql的快取,另外對重量級、更新少的資料可以考慮使用應用級別的快取;

還有就是通過分庫分表的方式進行優化,主要有垂直分表和水平分表(水平分就是分布式,資料列數不變)。

資料庫知識點

1.truncate delete和drop delete delete是一行行刪除資料,不影響表結構,並且會記錄日誌,可以進行回滾。truncate 刪除表中所有資料,不記錄日誌,不可以回滾,truncate之後表空間和索引大小會回到初始值。所以truncate之前最好備份 drop 刪除整個表結...

資料庫知識點

資料庫的事務,是指作為單個邏輯工作單元執行的一系列操作。事務處理可以確保除非事務性單元內的所有操作都成功完成,否則不會永久更新面向資料的資源。通過將一組相關操作組合為乙個要麼全部成功要麼全部失敗的單元,可以簡化錯誤恢復並使應用程式更加可靠。乙個邏輯工作單元要成為事務,必須滿足所謂的acid 原子性 ...

資料庫知識點

oracle 安裝oracle時需要的所需的軟體包安裝命令 yum install binutils compat libcap1 gcc glibc ksh libaio libgcc libstdc libxi libxtst make sysstat 1 建使用者create user ora...