主頁 > 資料庫 > 學會熟練使用MySQL索引,快速檢索資料庫,大大提升作業效率

學會熟練使用MySQL索引,快速檢索資料庫,大大提升作業效率

2021-01-27 14:01:30 資料庫

文章目錄

  • 一、MySQL 索引
    • (一)、索引的概念
    • (二)、索引的作用
    • (三)、索引的副作用
    • (四)、創建索引的原則依據
    • (五)、索引的分類和創建
    • (六)、查看索引
    • (七)、洗掉索引
    • (八)、實際案例

一、MySQL 索引

(一)、索引的概念

1、索引是一個排序的串列,在這個串列中存盤著索引的值和包含這個值的資料所在行的物理地址 (類似于C語言的鏈表通過指標指向資料記錄的記憶體地址) ,
2、使用索引后可以不用掃描全表來定位某行的資料,而是先通過索引表找到該行資料對應的物理地址然后訪問相應的資料,因此能加快資料庫的查詢速度,
3、索引就好比是一本書的目錄,可以根據目錄中的頁碼快速找到所需的內容,
4、索引是表中一列或者若干列值排序的方法,
5、建立索引的目的是加快對表中記錄的查找或排序,

(二)、索引的作用

1、設定了合適的索引之后,資料庫利用各種快速定位技術,能夠大大加快查詢速度,這是創建索引的最主要的原因,
2、當表很大或查詢涉及到多個表時,使用索引可以成千,上萬倍地提高查詢速度,
3、可以降低資料庫的I/O成本,并且索引還可以降低資料庫的排序成本,
4、通過創建唯一性索引,可以保證資料表中每一行資料的唯一性,
5、可以加快表與表之間的連接,
6、在使用分組和排序時,可大大減少分組和排序的時間,

(三)、索引的副作用

1、索引需要占用額外的磁盤空間,

  • 對于 MyISAM 引擎而言,索引檔案和資料檔案是分離的,索引檔案用于保存資料記錄的地址,
  • 而 InnoDB 引擎的表資料檔案本身就是索引檔案,

2、在插入和修改資料時要花費更多的時間,因為索引也要隨之變動,

(四)、創建索引的原則依據

索引隨可以提升資料庫查詢的速度,但并不是任何情況下都適合創建索引,因為索引本身會消耗系統資源,在有索引的情況下,資料庫會先進行索引查詢,然后定位到具體的資料行,如果索引使用不當,反而會增加資料庫的負擔,

1、表的主鍵、外鍵必須有索引,因為主鍵具有唯一性,外鍵關聯的是主表的主鍵,查詢時可以快速定位,
2、記錄數超過300行的表應該有索引,如果沒有索引,每次查詢都需要把表遍歷一遍,會嚴重影響資料庫的性能,
3、經常與其他表進行連接的表,在連接欄位上應該建立索引,
4、唯一 性太差的欄位不適合建立索引,
5、更新太頻繁地欄位不適合創建索引,
6、經常出現在 where 子句中的欄位,特別是大表的欄位,應該建立索引,
7、索引應該建在選擇性高的欄位上,
8、索引應該建在小欄位.上,對于大的文本欄位甚至超長欄位,不要建索引,

(五)、索引的分類和創建

create table member (id int(10),name varchar(10),Cardid varchar(10),phone int(11),address varchar(50),remark text);

(1)、普通索引: 最基本的索引型別,沒有唯一性之類的限制,
直接創建索引
CREATE INDEX 索引名 ON 表名 (列名[(length)]);
# (列名(length)): length是可選項, 下同, 如果忽略 length 的值,則使用整個列的值作為索引,如果指定使用列的前length個字符來創建索引,這樣有利于減小索引檔案的大小,
#索引名建議以 “_index" 結尾,

create index name_index on member (name);

修改表方式創建
ALTER TABLE 表名 ADD INDEX 索引名 (列名);

創建表的時候指定索引
CREATE TABLE 表名 (欄位1 資料型別,欄位2 資料型別 [,...],INDEX 索引名 (列名));

(2)、唯一索引: 與普通索引類似,但區別是唯一索引列的每個值都唯一,唯一索引允許有空值(注意和主鍵不同),如果是用組合索引創建,則列值的組合必須唯一,添加唯一鍵將自動創建唯一索引,

直接創建唯一索引:
CREATE UNIQUE INDEX 索引名 ON 表名 (列名);

create unique index cardid_index on member (cardid);

修改表方式創建:
ALTER TABLE 表名 ADD UNIQUE 索引名 (列名);

創建表的時候指定:
CREATE TABLE 表名 (欄位1 資料型別,欄位2 資料型別 [,...],UNIQUE 索引名 (列名));

(3)、主鍵索引: 是一種特殊的唯一索引,必須指定為 “PRIMARY KEY",一個表只能有一個主鍵,不允許有空值,
添加主鍵將自動創建主鍵索引,

創建表的時候指定:
CREATE TABLE 表名 ([...],PRIMARY KEY (列名));

修改表方式創建:
ALTER TABLE 表名 ADD PRIMARY KEY (列名);

alter table member add primary key(id);

(4)、組合索引 (單列索引與多列索引): 可以是單列上創建的索引,也可以是在多列上創建的索引,需要滿足最左原則,因為 select陳述句的 where 條件是依次從左往右執行的,所以在使用 select 陳述句查詢時 where 條件使用的欄位順序必須和組合索引中的排序一致,否則索引將不會生效,

CREATE TABLE 表名 (列名1 資料型別,列名2 資料型別,列名3 資料型別,INDEX 索引名(列名1,列名2,列名3));

select * from 表名 where 列名1='...' AND 列名2='...' AND 列名3='...';

(5)、全文索引 (FULLTEXT): 適合在進行模糊查詢的時候使用,可用于在一篇文章中檢索文本資訊,在MySQL5.6 版本以前FULLTEXT索引僅可用于MyISAM引擎,在5.6版本之后innodb 引擎也支持FULLTEXT 索引,全文索引可以在CHAR、VARCHAR 或者 TEXT型別的列上創建,每個表只允許有一個全文索引,

直接創建索引:
CREATE FULLTEXT INDEX 索引名 ON 表名 (列名);

修改表方式創建:
ALTER TABLE 表名 ADD FULLTEXT 索引名 (列名);

alter table member add fulltext remark_index (remark);

創建表的時候指定索引:
CREATE TABLE 表名 (欄位1 資料型別 [,..., FULLTEXT 索引名 (列名));
#資料型別可以為CHAR、 VARCHAR 或者 TEXT

使用全文索引查詢:
SELECT * FROM 表名 WHERE MATCH(列名) AGAINST('查詢內容');

insert into member values(1,'zhangsan',123123,123123,'nanjing','this is test!');
insert into member values(2,'lisi',456456,456456,'beijing','this is kgc!');
insert into member values (3,'wangwu',789789,789789,'shanghai','this is kgc test!');
select * from member where match (remark) against('test');

(六)、查看索引

show index from 表名;
show keys from 表名;

各欄位的含義如下:
Table: 表的名稱,
Non_unique: 如果索引不能包括重復詞,則為0;如果可以,則為1
Key_name: 索引的名稱,
Seq_in_index: 索引中的列序號,從1開始,
Column_name: 列名稱,
Cpllation: 列以什么方式存盤在索引中,在MySQL中,有值‘A’(升序)  NULL(無分類)
Cardinality: 索引中唯一值數目的估計值,
Sub_part: 如果列只是被部分地編入索引,則為被編入索引的字符的數目,如果整列被編入索引,則為NULL,
Packed: 指示關鍵字如何被壓縮,如果沒有被壓縮,則為NULL,
Null: 如果列含有NULL, 則含有YES, 如果沒有,則該列含有NO,
Index_type: 用過的索引方法 (BTREE,FULLTEXT,HASH,RTREE)
Comment:  備注,

(七)、洗掉索引

1、直接洗掉索引
DROP INDEX 索引名 ON 表名;

2、修改表方式洗掉索引
ALTER TABLE 表名 DROP INDEX 索引名;

3、洗掉主鍵索引
ALTER TABLE 表名 DROP PRIMARY KEY;

(八)、實際案例

案例:為某商場做一個會員卡的系統,這個系統有一個會員表,有下列欄位:
會員編號  INT
會員姓名  VARCHAR(10)
會員身份證號碼  VARCHAR(18)
會員電話  INT(11)
會員住址  VARCHAR (50)
會員備注資訊  TEXT 

create table member (id int(10),name varchar(10),cardid varchar(18),phone int(11),address varchar(50),remark text);
alter table member add primary key (id);
create index name_index on member (name); 
create unique index cardid_index on member (cardid);
alter table member add fulltext remark_index (remark);

會員編號,作為主鍵,使用 PRIMARY KEY
會員姓名,如果要建索引的話,那么就是普通的 INDEX
會員身份證號碼,如果要建索引的話,那么可以選擇 UNIQUE (唯一的,不允許重復)
會員備注資訊,如果需要建索引的話,可以選擇 FULLTEXT,全文搜索,
不過 FULLTEXT 用于搜索很長一篇文章的時候,效果最好,用在比較短的文本,如果就一兩行字的,普通的 INDEX 也可以,

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/253167.html

標籤:其他

上一篇:作業總結:涉及資料庫、軟體測驗等內容

下一篇:求助:oracle的plsql方面,根據某一相同欄位合并其余欄位的sql需求

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more