SQL優(yōu)化

索引的特點(diǎn)
MySQL中索引的儲(chǔ)存結(jié)構(gòu)有兩種:B 樹(shù)結(jié)構(gòu)和 HASH 結(jié)構(gòu),具體和表的儲(chǔ)存引擎相關(guān):MylSAM 和INNODB 儲(chǔ)存引擎只支持 B 樹(shù)結(jié)構(gòu)的索引; 還有另外兩種 Memory 儲(chǔ)存引擎和 Archive 儲(chǔ)存引擎。
索引的優(yōu)點(diǎn):
1.通過(guò)創(chuàng)建唯一索引,可以保證數(shù)據(jù)庫(kù)表中每一行數(shù)據(jù)的唯一性。
2.可以大大加快數(shù)據(jù)的查詢速度。
3.在實(shí)現(xiàn)數(shù)據(jù)的引用完整性方面, 可以加速表盒表之間的連接。
4.在使用分組和排序進(jìn)行查詢數(shù)據(jù)時(shí),也可以顯著減少查詢中分組和排序的時(shí)間。
索引的缺點(diǎn):
1.創(chuàng)建索引和維護(hù)索引要耗費(fèi)時(shí)間。
2.索引需要占用磁盤空間,除了數(shù)據(jù)表占數(shù)據(jù)空間之外,每一個(gè)索引還要占一定的物理空間(InnoDB 數(shù)據(jù)表上的索引是表空間的一個(gè)組成部分),如果有大量的索引,索引文件可能比數(shù)據(jù)文件更快達(dá)到最大文件尺寸。占時(shí)間,占空間。
3.索引也會(huì)動(dòng)態(tài)的維護(hù),這樣就降低了數(shù)據(jù)的維護(hù)速度。
索引的分類
1.普通分類
普通索引是 MySQL 中的基本索引類型,允許在定義索引的列中插入重復(fù)值和空值。
2.唯一索引
索引列的值必須唯一,但允許有空值(但只能有一個(gè))
3.主鍵索引
主鍵索引是一種特殊的唯一索引,不允許有空值。主鍵索引一定是唯一索引,但是唯一索引不一定是主鍵索引。
4 組合索引
組合索引指在表的多個(gè)字段組合上包上創(chuàng)建的索引,只有在查詢條件中使用了這些字段的左法字段時(shí),案引才會(huì)被使用。使用組合索引時(shí)遵循龍前綴集合。
創(chuàng)建組合索引時(shí)需要注意以下三點(diǎn):

A. 當(dāng)需要頻繁地將兩列或多列作為個(gè)整體進(jìn)行搜索時(shí),可以創(chuàng)建組合索引。
B. 創(chuàng)建組合索引時(shí)先列出唯一性最好的列。
C. 組合索引中列的順序和數(shù)量會(huì)影響查詢的性能。

  1. 全文索引
    全文索引類型為FULLTEXT,在定義索引的列上支持值的全文查找,允許在這些索引列中插入重復(fù)值和空值。全文索引可以在CHAR、VARCHAR或者TEXT類型的列上設(shè)置,同時(shí)在MySQL中只有MyISAM存儲(chǔ)引擎支持全文索引。
  2. 空間索引
    空間索引是對(duì)空間數(shù)據(jù)類型的字段建立的索引,MySQL中的空間數(shù)據(jù)類型有4種,分別是:GEOMETRY、POINT、 LINESTRING 和POLYGON。MySQL使用SPATIAL關(guān)鍵字進(jìn)行擴(kuò)展,使得能夠用于創(chuàng)建正規(guī)索引類似的語(yǔ)法創(chuàng)建空間索引。創(chuàng)建控件索引的字段,必須設(shè)置NOT NULL約束, 空間索引只能在存儲(chǔ)引擎為MyISAM的表中創(chuàng)建。
    索引的設(shè)計(jì)原則:
    1.索引并非越多越好,一個(gè)表中如果有大量的索引,不僅占用磁盤空間,而且會(huì)影響 INSERT 、DELETE 、UPDATE 等語(yǔ)句的性能,因?yàn)楫?dāng)表中數(shù)據(jù)更改時(shí),索引也會(huì)進(jìn)行調(diào)整和更新。
    2.避免對(duì)經(jīng)常更新的列設(shè)置索引,并且索引中的列進(jìn)可能的少。而對(duì)經(jīng)常用于查詢的字段應(yīng)該創(chuàng)建索引,但要避免添加不必要的字段。
    3.數(shù)據(jù)量小的表最好不要使用索引,由于數(shù)據(jù)較少,查詢花費(fèi)的時(shí)間可能比遍歷索引的時(shí)間還短,索引可能不會(huì)產(chǎn)生優(yōu)化效果。
    4.在不同值較少的字段上不必要建立索引,如性別字段。
create database two20210611 default charset=utf8;

use two20210611;

create table student (
    studentid char(10) PRIMARY key,
    studentname varchar(10) not null,
    gender varchar(2) ,
    age int ,
    index(studentname)
);

show create table student;

insert into student values ('1' , '丘處機(jī)' , '男' , 46 );
select * from student;

-- 執(zhí)行計(jì)劃 explain
explain select * from student where studentname="丘處機(jī)";

-- 組合索引
create table student2 (
    studentid char(10) PRIMARY key,
    studentname varchar(10) not null,
    age int ,
    city varchar(10),
    dormitoryNo varchar(5),     # 宿舍編號(hào)
    index MultiIndex(city,dormitoryNo)  # 組合索引
);

show create table student2;
insert into student2 values ('1' , '楊過(guò)' , 19 , '活死人墓' , '002') ;

select * from student2 where studentname="楊過(guò)";
explain select * from student2 where studentname="楊過(guò)";

select * from student2 where city="活死人墓" and dormitoryNo ='002';
explain select * from student2 where city="活死人墓" and dormitoryNo ='002';

-- 刪除索引
alter table student drop index studentname;
-- 創(chuàng)建索引
create index studentname on student(studentname) ;

-- 事務(wù)
create table user(
    u_name varchar(20) ,
    unique(u_name)
);

insert into user values ("小龍女");

select * from user;

begin;
insert into user values ("李莫愁");
commit;

begin;  -- 事務(wù)的開(kāi)始
insert into user values ("尹志平");
commit;  -- 事務(wù)的結(jié)束


begin ;
insert into user values ("郭靖");
rollback; -- 回滾


-- 回滾點(diǎn)
begin;
insert into user values ("A");
savepoint first_point;
insert into user values ("B");
rollback to savepoint first_point;
insert into user values("C");
commit;

select * from user ;








?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 優(yōu)化 SQL 語(yǔ)句的一般步驟 通過(guò) show status 命令了解各種 SQL 的執(zhí)行頻率 MySQL 客戶端連...
    微日月閱讀 553評(píng)論 0 0
  • MySQL學(xué)習(xí)筆記(6) SQL優(yōu)化(1) 優(yōu)化SQL的一般步驟 本文所涉及案例表來(lái)自MySQL的案例庫(kù)sakil...
    BigfaceMonster閱讀 1,301評(píng)論 0 9
  • 如何提高M(jìn)ySQL數(shù)據(jù)庫(kù)的查詢效率,可以從兩個(gè)方面入手:使用索引和使用JOIN,本文主要講使用索引的一些原則和優(yōu)化...
    _Zy閱讀 3,342評(píng)論 0 12
  • SQL 優(yōu)化 在應(yīng)用的的開(kāi)發(fā)過(guò)程中,由于初期數(shù)據(jù)量小,開(kāi)發(fā)人員寫 SQL 語(yǔ)句時(shí)更重視功能上的實(shí)現(xiàn), 但是當(dāng)應(yīng)用系...
    安靜點(diǎn)就睡吧閱讀 345評(píng)論 0 2
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月,有人笑有人哭,有人歡樂(lè)有人憂愁,有人驚喜有人失落,有的覺(jué)得收獲滿滿有...
    陌忘宇閱讀 8,832評(píng)論 28 54

友情鏈接更多精彩內(nèi)容