?
🌟?各位看官好,我是maomi_9526!
🌍?種一棵樹最好是十年前,其次是現在!
🚀?今天來學習C語言的相關知識。
👍?如果覺得這篇文章有幫助,歡迎您一鍵三連,分享給更多人哦
目錄
第1關:創建一般索引
第2關:刪除索引-練習
第3關:創建聯合索引
第4關:創建唯一索引
第5關:創建前綴索引
第1關:創建一般索引
任務描述
本關任務:為 student 表按姓名升序建立索引,索引名為 idx_sname。
相關知識
為了完成本關任務,你需要掌握:
- 索引是什么;
- 索引的分類;
- 索引的創建和刪除;
- 查詢索引。
索引是什么
數據庫索引是一種提高數據庫系統性能的方法。索引能讓數據庫服務器更快地查找和獲取表中指定的行。
例如,為了方便讀者快速查找書中的術語,很多書籍在最后附加了索引頁,術語按字母排序,同時給出頁碼。這樣讀者可以根據術語名,快速獲取頁碼,而不用翻閱整本書。
但是索引也給數據庫系統帶來了一定的開銷,所以我們應該謹慎地使用它們。
索引的分類
索引大體可分為單列索引(普通索引,唯一索引,主鍵索引)、組合索引、全文索引、空間索引四類。本實訓我們主要介紹單例索引和組合索引:
- 單例索引:一個索引只包含單個列,但一個表中可以有多個單列索引;
- 普通索引:僅加速查詢 最基本的索引,沒有任何限制,是我們大多數情況下使用到的索引;
- 唯一索引:索引列中的值必須是唯一的,但允許為空值;
- 主鍵索引:是一種特殊的唯一索引,不允許有空值。
- 組合索引:在表的多個字段上創建的索引,只有在查詢條件中使用了這些字段的左邊字段時,索引才會被使用,使用組合索引時遵循最左前綴集合。
索引的創建和刪除
創建索引
創建索引有兩種方式,一種是在建表時創建,另一種是建表后創建:
普通索引:
創表時創建普通索引:
CREATE table mytable(
?id INT NOT NULL,
?username VARCHAR(16) NOT NULL,
?INDEX [indexName] (username)
);
建表后創建普通索引:
create INDEX 索引名稱 on 表名(字段名 desc/asc);
#或者
ALTER TABLE 表名 ADD INDEX 索引名稱 (字段名);
asc 代表升序索引,desc 代表降序,mysql 默認升序索引。
唯一索引:
CREATE UNIQUE INDEX 索引名稱 ON 表名(字段名);
#或者
ALTER TABLE 表名 ADD UNIQUE (字段名);
主鍵索引:
主鍵索引一般在建表時創建,會設為 int 而且是 AUTO_INCREMENT 自增類型的,例如一般表的 id 字段。
CREATE TABLE mytable (
? id int(11) NOT NULL AUTO_INCREMENT,
? PRIMARY KEY (id)
);
組合索引:
組合索引就是在多個字段上創建一個索引。(應用場景:當表的行數遠遠大于索引鍵的數目時,使用這種方式可以明顯加快表的查詢速度)
CREATE INDEX 索引名稱 ON 表名(字段1,字段2,字段3);
ALTER TABLE 表名 ADD INDEX 索引名稱(字段1,字段2,字段3);
查詢表中索引
查詢索引 SQL:
show index from 表名;
編程要求
在右側編輯器補充代碼,要求如下:
- 為 student 表按姓名升序建立索引,索引名為 idx_sname。
測試說明
平臺會對你編寫的代碼進行測試,將你所創建的索引都現實出來,具體現實效果請查看右側測試集。
開始你的任務吧,祝你成功!
use teachingdb;/****請在此編寫代碼,操作完畢之后點擊評測******//**********Begin**********/create index idx_sname on student(sname);/**********End**********/show index from student;
第2關:刪除索引-練習
任務描述
本關任務:刪除索引。
相關知識
刪除索引
同樣,刪除索引也有兩種方式。
#使用drop刪除索引
drop index index_name on table_name ;
#使用alter刪除索引
alter table table_name drop index index_name ;
alter table table_name drop primary key ; #刪除主鍵索引
編程要求
根據提示,在右側編輯器補充代碼,刪除索引 idx_sname。
測試說明
編寫代碼后,點擊測評即可。
開始你的任務吧,祝你成功!
use teachingdb;/****請在此編寫代碼,操作完畢之后點擊評測******//**********Begin**********/
drop index idx_sname on student;/**********End**********/show index from student;
第3關:創建聯合索引
任務描述
本關任務:創建聯合索引 idx_sname_sdept。
相關知識
為了完成本關任務,你需要掌握:如何創建聯合索引。
創建聯合索引
語法:
create index 索引名稱 on 表名(字段名稱)
示例:
create index idx_name_age on student( name,age);
聯合索引的使用規則
- 最左前綴原則: 聯合索引的查詢效率依賴于索引列的順序。查詢時,必須從聯合索引的最左邊的列開始匹配,否則索引可能不會被使用。例如,對于索引idx_name_age:
- 查詢條件WHERE name = 'Alice' AND age = 20會使用索引。
- 查詢條件WHERE age = 20 AND name = 'Alice'也會使用索引(因為MySQL會自動優化)。
- 查詢條件WHERE age = 20不會使用索引,因為沒有從最左邊的列name開始。
- 部分列的使用: 如果查詢條件只使用了聯合索引的一部分列(從最左邊開始),索引仍然可以被部分使用。例如:
- 查詢條件WHERE name = 'Alice'會使用索引,但只會利用name這一部分。
- 排序和范圍查詢:聯合索引在排序和范圍查詢中也非常有效。例如:
SELECT * FROM students WHERE name = 'Alice' ORDER BY age;
編程要求
根據任務完成代碼編寫,將代碼補充在右側編輯器中: (1)在 student 表 sname 字段和 sdept 字段上創建聯合索引 idx_sname_sdept; (2)編寫一個只利用聯合索引進行查詢的例子(使用EXPLAIN 分析)。
測試說明
編寫代碼后,點擊測評即可。
開始你的任務吧,祝你成功!
use TeachingDb;/****請在此編寫代碼,操作完畢之后點擊評測******//**********Begin**********//**********創建索引idx_sname_sdept**********/
create index idx_sname_sdept on student(sname,sdept);/**********應用舉例**********/
EXPLAIN select sname,sdept from student where sname='馬小燕' and sdept='計算機';/**********End**********/
第4關:創建唯一索引
任務描述
本關任務:創建唯一索引 uk_cname。
相關知識
為了完成本關任務,你需要掌握:如何創建唯一索引。
如何創建唯一索引
語法:
create unique index 索引名稱 on 表名(字段名稱);
示例:
create unique index secondIndex on student(name, address);
注意:
- 索引名稱、表名、字段名稱 都不要用引號括起來;
- 對于聯合索引而言,字段名稱可以有多個,中間用英文逗號分隔即可;
- 唯一索引數據不可重復。
編程要求
在 course 表的 cname 字段上創建唯一索引 uk_cname ,并將代碼補充在右側編輯器中。
測試說明
編寫代碼后,點擊測評即可。
開始你的任務吧,祝你成功!
use TeachingDb;/****請在此編寫代碼,操作完畢之后點擊評測******//**********Begin**********/create unique index uk_cname on course (cname);/**********End**********/show index from course;
第5關:創建前綴索引
任務描述
本關任務:創建前綴索引。
相關知識
前綴索引是基于列的前綴值創建的索引。例如,對于一個VARCHAR(255)類型的列,你可以選擇只對前n個字符建立索引。這樣,索引的大小會顯著減小,但仍然可以在一定程度上提高查詢性能。
創建前綴索引
創建前綴索引的兩種方式
//1.使用CREATE INDEX語句
CREATE INDEX index_name ON table_name (column_name (length));
//2.使用ALTER TABLE語句
ALTER TABLE table_name ADD INDEX (column_name (length));
確定length的取值算法
確定length的SQL語句:
SELECT COUNT(DISTINCT LEFT(column_name,length))/COUNT(column_name)?
FROM table_name;
length的取值從1逐步增加,當查詢返回的值為1或不再發生變化時,length的值就是前綴索引的合理取值。
編程要求
在 course 表的 cname 字段上創建前綴索引 pidx_cname,并將代碼補充在右側編輯器中:
(1)測試cname前綴索引length的合理取值;
(2)創建前綴索引 pidx_cname。
測試說明
編寫代碼后,點擊測評即可。
開始你的任務吧,祝你成功!
use TeachingDb;/****請在此編寫代碼,操作完畢之后點擊評測******//**********Begin**********//**********測試cname字段前綴索引的合理取值**********/
select COUNT(DISTINCT LEFT(cname,4))/COUNT(cname) from course;/**********創建前綴索引pidx_cname**********/ create index pidx_cname on course(cname(4));/**********End**********/
show index from course;
任務描述
本關任務:創建全文索引 ft_cname 。
相關知識
全文索引(Full-Text Index) 是一種用于高效檢索文本內容中關鍵詞或短語的數據庫索引技術。它與傳統的 B-Tree 索引不同,能夠支持自然語言搜索(如模糊匹配、分詞、相關性排序等),適用于對長文本內容進行復雜查詢的場景。
全文索引(Full-Text Index)是一種專門用于快速搜索文本內容的索引類型,通常在需要對大量文本數據進行全文搜索的場景中使用。在 MySQL 中,全文索引主要用于 TEXT 字段,但 VARCHAR 在特定場景下也可支持。
創建全文索引
創建全文索引的兩種方式
//1.CRATE INDEX添加
CREATE FULLTEXT INDEX index_name ON table_name (column1,column2,...);
//2.ALTER添加
ALTER TABLE table_name ADD FULLTEXT INDEX index_name (column1,column2,...);
使用全文索引
使用全文索引的方式
SELECT * FROM 表名 WHERE MATCH(字段) AGAINST('查詢文本') ;
編程要求
若在 student 表的remarks字段上以文本的形式存儲學生的備注信息,在remarks字段上創建全文索引 ft_remarks,并檢索是“學生干部”的學生信息,將代碼補充在右側編輯器中。
測試說明
編寫代碼后,點擊測評即可。
開始你的任務吧,祝你成功!
use TeachingDb;/****請在此編寫代碼,操作完畢之后點擊評測******//**********Begin**********/
/**********(1)創建全文索引ft_remarks**********/
create fulltext index ft_remarks on student (remarks);
/**********(2)顯示student表上的索引**********/
show index from student;
/**********(3)檢索“學生干部”的學生姓名和備注信息**********/
select sname,remarks from student where match(remarks)against('學生干部');/**********End**********/