mysql數據庫索引頁號為什么從3開始_MySQL數據庫快問快答

原標題:MySQL數據庫快問快答

a4fdcb7a45afe6a761c273521c4ac40a.png

前言

今天樓主給大家列一下關于數據庫幾個常見問題的要點,如果大家對其中的問題感興趣,可以自行擴展研究。

1. UNION ALL 與 UNION 的區別

UNION和UNION ALL關鍵字都是將兩個結果集合并為一個。

UNION在進行表鏈接后會篩選掉重復的記錄,所以在表鏈接后會對所產生的結果集進行排序運算,刪除重復的記錄再返回結果。

而UNION ALL只是簡單的將兩個結果合并后就返回。

由于UNION需要排序去重,所以 UNION ALL 的效率比 UNION 好很多。

2. TRUNCATE 與 DELETE 區別

TRUNCATE 是DDL語句,而 DELETE 是DML語句。

TRUNCATE 是先把整張表drop調,然后重建該表。而 DELETE 是一行一行的刪除,所以 TRUNCATE 的速度肯定比 DELETE 速度快。

TRUNCATE 不可以回滾,DELETE 可以。

TRUNCATE 執行結果只是返回0 rows affected,可以解釋為沒有返回結果。

TRUNCATE 會重置水平線(自增長列起始位),DELETE 不會。

TRUNCATE 只能清理整張表,DELETE 可以按照條件刪除。

一般情景下,TRUNCATE性能比DELETE好一點。

3. TIMESTAMP 與 DATETIME 的區別

相同點

TIMESTAMP 列的顯示格式與 DATETIME 列相同。顯示列寬固定在19字符,并且格式為YYYY-MM-DD HH:MM:SS。

不同點

TIMESTAMP

4個字節存儲,時間范圍:1970-01-01 08:00:01~2038-01-19 11:14:07。

值以UTC格式保存,涉及時區轉化,存儲時對當前的時區進行轉換,檢索時再轉換回當前的時區。

DATETIME

8個字節存儲,時間范圍:1000-10-01 00:00:00~9999-12-31 23:59:59。

實際格式存儲,與時區無關。

4. 什么是聯合索引

兩個或更多個列上的索引被稱作聯合索引,聯合索引又叫復合索引。

5. 為什么要使用聯合索引

減少開銷: 建一個 聯合索引( col1,col2,col3),實際相當于建了(col1),(col1,col2),(col1,col2,col3)三個索引。減少磁盤空間的開銷。

覆蓋索引: 對聯合索引(col1,col2,col3),如果有如下的sql: select col1,col2,col3 from test where col1=1 and col2=2。那么MySQL可以直接通過遍歷索引取得數據,而無需回表,這減少了很多的隨機io操作。覆蓋索引是主要的提升性能的優化手段之一。

效率高: 索引列越多,通過索引篩選出的數據越少。有1000W條數據的表,有如下sql select from table where col1=1 and col2=2 and col3=3 ,假設假設每個條件可以篩選出10%的數據,如果只有單值索引,那么通過該索引能篩選出 1000W * 10%=100w 條數據,然后再回表從100w條數據中找到符合 col2=2 and col3= 3 的數據,然后再排序,再分頁;如果是聯合索引,通過索引篩選出 1000w * 10% * 10% * 10%=1w ,效率得到明顯提升。

6. MySQL 聯合索引最左匹配原則

在 MySQL 建立聯合索引時會遵循最左前綴匹配的原則,即最左優先,在檢索數據時從聯合索引的最左邊開始匹配。

MySQL 會一直向右匹配直到遇到范圍查詢(>、 3 and d = 4 如果建立(a,b,c,d)順序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引則都可以用到,a,b,d的順序可以任意調整。

7. 什么是聚集和非聚集索引

聚集索引就是以主鍵創建的索引。

非聚集索引就是以非主鍵創建的索引。

8. 什么是覆蓋索引

覆蓋索引(covering index)指一個查詢語句的執行只用從索引頁中就能夠取得(如果不是聚集索引,葉子節點存儲的是主鍵+列值,最終還是要回表,也就是要通過主鍵再查找一次),避免了查到索引后,再做回表操作,減少I/O提高效率。

可以結合第10個問題更容易理解。

9. 什么是前綴索引

前綴索引就是對文本的前幾個字符(具體是幾個字符在創建索引時指定)創建索引,這樣創建起來的索引更小。但是MySQL不能在ORDER BY或GROUP BY中使用前綴索引,也不能把它們用作覆蓋索引。

創建前綴索引的語法:

ALTERTABLEtable_name ADD

KEY(column_name(prefix_length))

10. InnoDB 與 MyISAM 索引存儲結構的區別

MyISAM索引文件和數據文件是分離的,索引文件僅保存數據記錄的地址。

而在InnoDB中,表數據文件本身就是按B+Tree組織的一個索引結構,這棵樹的葉節點data域保存了完整的數據記錄。這個索引的key是數據表的主鍵,因此InnoDB表數據文件本身就是主索引,所以必須有主鍵,如果沒有顯示定義,自動為生成一個隱含字段作為主鍵,這個字段長度為6個字節,類型為長整型。

InnoDB的輔助索引(Secondary Index,也就是非主鍵索引)存儲的只是主鍵列和索引列,如果主鍵定義的比較大,其他索引也將很大。

MyISAM引擎使用B+Tree作為索引結構,索引文件葉節點的data域存放的是數據記錄的地址,指向數據文件中對應的值,每個節點只有該索引列的值。

MyISAM主索引和輔助索引(Secondary key)在結構上沒有任何區別,只是主索引要求key是唯一的,輔助索引可以重復,(由于MyISAM輔助索引在葉子節點上存儲的是數據記錄的地址,和主鍵索引一樣,所以不需要再遍歷一次主鍵索引)。

簡單的說:

主索引的區別: InnoDB的數據文件本身就是索引文件。而MyISAM的索引和數據是分開的。

輔助索引的區別: InnoDB的輔助索引data域存儲相應記錄主鍵的值而不是地址。而MyISAM的輔助索引和主索引沒有多大區別。

11. 為什么盡量選擇單調遞增數值類型的主鍵

InnoDB中數據記錄本身被存于主索引(B+樹)的葉子節點上。這就要求同一個葉子節點內(大小為一個內存頁或磁盤頁)的各條數據記錄按主鍵順序存放,因此每當有一條新的記錄插入時,MySQL會根據其主鍵將其插入適當的結點和位置,如果頁面達到裝載因子(InnoDB默認為15/16),則開辟一個新的頁。

如果使用自增主鍵,那么每次插入新的記錄,記錄就會順序添加到當前索引結點的后續位置,當一頁寫滿,就會自動開辟一個新的頁,這樣就會形成一個緊湊的索引結構,近似順序填滿。由于每次插入時也不需要移動已有數據,因此效率很高,也不會增加很多開銷在維護索引上。

如果使用非自增主鍵,由于每次插入主鍵的值近似于隨機,因此每次新紀錄都要被插入到現有索引頁的中間某個位置,此時MySQL不得不為了將新記錄查到合適位置而移動元素,甚至目標頁可能已經被回寫到磁盤上而從緩存中清掉,此時又要從磁盤上讀回來,這增加了很多開銷,同時頻繁的移動、分頁操作造成了大量的碎片,得到了不夠緊湊的索引結構,后續不得不通過 OPTIMIZE TABLE 來重建表并優化填充頁面。

簡單的說:

索引樹只能定位到某一頁,每一頁內的插入還是需要通過比較、移動插入的。所以有序主鍵可以提升插入效率。

12. 建表時,int 后面的長度的意義

int占多少個字節,已經是固定的了,長度代表了顯示的最大寬度。如果不夠會用0在左邊填充,但必須搭配zerofill使用。也就是說,int的長度并不影響數據的存儲精度,長度只和顯示有關。

13. SHOW INDEX 結果字段代表什么意思

Table:

表名。

Non_unique:

0:該索引不含重復值。

1:該索引可含有重復值。

Key_name:

索引名稱,如果是注解索引,名稱總是為PRIMARY。

Seq_in_index:

該列在索引中的序號,從 1 開始。例如:存在聯合索引 idx_a_b_c (a,b,c),則a的Seq_in_index=1,b=2,c=3。

Column_name:

列名。

Collation:

索引的排列順序:A(ascending),D (descending),NULL (not sorted)。

Cardinality:

一個衡量該索引的唯一程度的值,可以使用ANALYZE TABLE(INNODB) 或者 myisamchk -a(MyISAM)更新該值。

如果表記錄太少,該字段的意義不大。一般情況下,該值越大,索引效率越高。

Sub_part:

對于前綴索引,用于索引的字符個數。如果整個字段都加上了索引,則顯示為NULL。

Null:

YES:該列允許NULL值。

'':該列不允許NULL值。

Index_type:

索引類型,包括(BTREE, FULLTEXT, HASH, RTREE)。

如何解決like'%字符串%'時索引失效?

LIKE問題:like 以通配符開頭 ('%abc…'),mysql索引失效會變成全表掃描的操作。

罪魁禍首是%,不是LIKE,LIKE 條件是 type = range 級別

%xxx%:全表掃描

%xxx:全表掃描

xxx%:range

解決辦法:

使用覆蓋索引,可以由 ALL 變為INDEX,為啥呢?覆蓋索引之后就能使用使用索引進行全表掃描。這里要注意一下,使用符合索引的時候,命中一個字段就可以,不用全部命中。

15. MySQL高效分頁

當然想要實現上述效果的前提是:返回搜狐,查看更多

id是唯一索引,而且單調遞增。

N 的值是上一次查詢的記錄的最后一條id,(需要前端保存一下,不能直接用傳統的方法獲得)

不支持跨頁查詢,只能按照第1,2,3,4頁這樣查詢逐頁查詢。

責任編輯:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/370577.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370577.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370577.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

通過簡單的Spring方面擺脫null參數

什么是世界上最令人討厭的,同時也是最受歡迎的例外? 我敢打賭這是NullPointerException。 NullPointerException可以表示任何東西,從簡單的“ ups,我認為不能為空”到數小時和數天的第三方庫調試(我敢于嘗試使用Doze…

java arraylist排序_最全Java集合筆記

集合概述什么是集合集合框架:用于存儲數據的容器。集合框架是為表示和操作集合而規定的一種統一的標準的體系結構。任何集合框架都包含三大塊內容:對外的接口、接口的實現和對集合運算的算法。接口:表示集合的抽象數據類型。接口允許我們操作…

【3】JVM-OutOfMemory異常重現

JVM中常見的OOM,那么如何通過自己編寫代碼產生這些OOM異常呢?通過寫代碼重現異常,是為了避免在工作中寫出有OOM BUG的代碼。之前雖然看過相關文章,但是沒自己寫過這些代碼,這次在編寫的實際過程中,由于和書…

CachedIntrospectionResults 初始化

轉載于:https://www.cnblogs.com/xiluhua/p/7862985.html

為什么有些內聯(行內)元素可以設置寬高?

為什么有些內聯(行內)元素如img、input可以設置寬高? 在說明之前我們先來了解一些定義。 塊級元素和內聯元素: ①塊級元素總是獨占一行,表現為另起一行開始,而且其后的元素也必須另起一行顯示。 寬度(w…

mongo數據庫和mysql數據庫的區別_Mongodb與mysql數據庫的區別

MySQLMongoDB說明mysqldmongod服務器守護進程mysqlmongo客戶端工具mysqldumpmongodump邏輯備份工具mysqlmongorestore邏輯恢復工具db.repairDatabase()修復數據庫mysqldumpmongoexport數據導出工具sourcemongoimport數據導入工具grant * privileges on *.* to …Db.addUser()Db…

在Eclipse中高效運行HTTP / REST集成測試

最近,我有機會使用由我親愛的Holger Staudacher編寫的OSGi-JAX-RS-Connector庫。 通過連接器,您可以通過將Path注釋的類型注冊為OSGi服務來輕松發布資源-實際上,它工作得很好。 對于我來說,使用普通的JUnit測試編寫驅動的服務類測…

Eclipse安裝TestNG插件

Eclipse安裝TestNG插件 TestNG是什么? TestNG按照其文檔的定義是: TestNG是一個測試框架,其靈感來自JUnit和NUnit的,但引入了一些新的功能,使其功能更強大,使用更方便。 TestNG是一個開源自動化測試框架;TestNG表示下…

basicdatasourcefactory mysql_Java基礎-DBCP連接池(BasicDataSource類)詳解

Java基礎-DBCP連接池(BasicDataSource類)詳解作者:尹正杰版權聲明:原創作品,謝絕轉載!否則將追究法律責任。實際開發中“獲得連接”或“釋放資源”是非常消耗系統資源的兩個過程,為了解決此類性能問題,通常…

生物神經網絡衍生出的算法

一個生物神經網絡的基本結構: 生物神經網絡由大量神經元組成,這些神經元之間通過突觸相互連接。神經元可以接收來自其他神經元的信號,并根據信號的強度和類型來調整自己的輸出信號。這種神經元之間的相互連接和信號傳遞形成了生物神經網絡的基…

echart實例數據 本地加載_JVM 類加載概述

來源:SegmentFault 思否社區作者:又壞又迷人JVM簡介JVM是Java Virtual Machine(Java虛擬機)的縮寫,JVM是一種用于計算設備的規范,它是一個虛構出來的計算機,是通過在實際的計算機上仿真模擬各種計算機功能來實現的。Ja…

JPA / Hibernate:基于版本的樂觀并發控制

本文是Hibernate和JPA中基于版本的樂觀并發控制的簡介。 這個概念已經很老了,上面已經寫了很多東西,但是無論如何我都看到了它被重新發明,誤解和濫用。 我在編寫它只是為了傳播知識,并希望引起人們對并發控制和鎖定的興趣。 用例…

高可用集群搭建

高可用集群搭建  創建hadoop賬戶 創建hadoop賬戶(#注意,接下來的操作均在hadoop賬戶下運行) # useradd hadoop # passwd hadoopsu - hadoopmkdir soft disk1 disk2mkdir -p disk{1,2}/dfs/{dn,nn}mkdir -p disk{1,2}/nodemgr/local 將本地目…

scrt如何切換成英文版_英文版SecureCRT顯示亂碼解決

英文版SecureCRT顯示亂碼解決系統環境:CentOS5.6以前Linux都是默認安裝在英文環境下,用英文版的SecureCRT查看系統內容輸出的也都是英文的,不會出現亂碼問題。今天同事在服務器安裝時默認選擇了簡體中文,這…

java try catch_Java捕獲異常

大家好,歡迎來到樂字節小樂的Java技術分享園地在Java中,凡是可能拋出異常的語句,都可以用try ... catch捕獲。把可能發生異常的語句放在try { ... }中,然后使用catch捕獲對應的Exception及其子類。多catch語句可以使用多個catch語…

haproxy文件操作

import os #導入os模塊def search(): #定義查找函數 with open(haproxy.txt,r) as f: #只讀方式打開文件 value input(請輸入您…

多語言持久性:帶有MongoDB和Derby的EclipseLink

從現在開始,多語種持久性一直是新聞。 從2011年底開始,在著名的Fowler帖子的推動下,我看到了更多更好的主意。 最新的一個是公司內部的學生項目,我們在其中使用Scala作為后端數據,將數據持久存儲到MongoDB,…

web前端開發最佳實踐--(筆記之JavaScript最佳實踐)

如何避免全局變量污染? 避免定義全局變量或全局函數用一個變量進行封裝,并返回外部需要訪問的接口如何寫出高維護的js代碼 配置數據和代碼邏輯分離 如: 改成: ---用js模板mustachehandlebarsjsMVC的數據模式 model:數據…

yum mysql5.7位置_CentOS yum 安裝 Mysql5.7

1 Steps for a Fresh Installation of MySQL# wget https://dev.mysql.com/get/mysql57-community-release-el6-9.noarch.rpm# yum localinstall mysql57-community-release-el6-9.noarch.rpm以上步驟其實是把 MySQL Yum repository 添加到了系統的 repository list 里去了。ll…

HTML/CSS基礎知識(四)

WEB標準和W3C的理解與認識 Web標準是一系列標準的集合。 網頁主要由三部分組成:結構(Structure)、表現(Presentation)和行為(Behavior)。 對應的標準也分三方面:結構化標準語言主要包…