mysql 添加索引的實(shí)現(xiàn)步驟
一、數(shù)據(jù)庫(kù)索引
1、索引(index)的概念
(1)是一個(gè)排序的數(shù)據(jù)結(jié)構(gòu),幫助mysql快速查詢、更新數(shù)據(jù)庫(kù)表中的數(shù)據(jù)
(2)無(wú)須對(duì)整個(gè)表進(jìn)行掃描,通過物理地址就可以找到所需數(shù)據(jù)
(3)為了提高表的搜索效率而對(duì)某些字段的值建立的數(shù)據(jù)結(jié)構(gòu);并不是所有字段都需要?jiǎng)?chuàng)建索引
2、索引的作用
(1)優(yōu)點(diǎn)
①當(dāng)數(shù)據(jù)量很大或查詢涉及多個(gè)表時(shí),使用索引,可以大大地提高數(shù)據(jù)查詢速度,降低數(shù)據(jù)庫(kù)的IO成本;
②通過索引對(duì)數(shù)據(jù)進(jìn)行排序,可以降低數(shù)據(jù)庫(kù)的排序成本,降低CPU的消耗;
③通過創(chuàng)建唯一性索引保證數(shù)據(jù)表數(shù)據(jù)的唯一性;
④可以加快表與表之間的連接
(2)缺點(diǎn)
①增加了數(shù)據(jù)庫(kù)的存儲(chǔ)空間
②降低了表的更新速度,插入和修改數(shù)據(jù)時(shí)花費(fèi)更多的時(shí)間
3、索引的分類
(1)從物理存儲(chǔ)的角度來(lái)劃分:
①聚簇索引:索引順序按照數(shù)據(jù)的物理位置,檢索多行數(shù)據(jù)速度更快
②非聚簇索引:索引順序不是按照數(shù)據(jù)的物理位置,檢索單行數(shù)據(jù)的速度更快
(2)從邏輯的角度來(lái)劃分
普通索引、唯一索引、主鍵索引、組合索引和全文索引
4、索引的添加與使用
(1)添加索引:通過某一個(gè)字段或某些字段添加
(2)索引使用:索引創(chuàng)建完成后無(wú)需調(diào)用,當(dāng)數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)查詢的時(shí)候,會(huì)自動(dòng)使用索引
二、索引的分類
1、普通索引(可以有多個(gè),對(duì)應(yīng)MUL)
(1)最基本的索引類型,不要求索引列的值唯一性
(2)創(chuàng)建普通索引的方式
直接創(chuàng)建 create index 索引名稱 on 表名(字段名稱(字段長(zhǎng)度)); #字段長(zhǎng)度可添加 修改表的方式創(chuàng)建 alter table 表名 add index 索引名稱 (字段名稱(字段長(zhǎng)度)); 創(chuàng)建表時(shí)創(chuàng)建 create table 表名(字段1,字段2,字段3,primary key(字段名稱),index 索引名稱(字段名稱(字段長(zhǎng)度));
示例
[root@localhost ~]# mysql -uroot -p #登錄mysql mysql> create database auth; #創(chuàng)建auth庫(kù) mysql> use auth; #進(jìn)入auth庫(kù) mysql> create table auth.users(id int(10) not null, 創(chuàng)建users表,建立id字段,數(shù)據(jù)類型int,不為空 -> name char(20) not null, -> age varchar(10) default '', -> primary key(id)); mysql> desc users; #查看表結(jié)構(gòu),存在3個(gè)字段 mysql> insert into users values('1','zhangsan','20'); mysql> insert into users values('2','lisi','23'); mysql> insert into users values('3','wangwu','26'); #字段下分別添加內(nèi)容 mysql> select * from users; #查看表中數(shù)據(jù) 直接創(chuàng)建方法 mysql> create index index_age on auth.users(age); #在age上創(chuàng)建索引在users表的age字段,index_age:索引名稱 修改表的方式創(chuàng)建 mysql> alter table users add index index_name(name); #在users表里的name字段創(chuàng)建索引,索引名稱為index_name mysql> desc users; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(10) | NO | PRI | NULL | | #主鍵索引對(duì)應(yīng)PRL | name | char(20) | NO | MUL | NULL | | #普通索引對(duì)應(yīng)MUL | age | varchar(10) | YES | MUL | | | +-------+-------------+------+-----+---------+-------+ mysql> show index from users; 或者mysql> show keys from users; #查看users表的索引 +-------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | +-表名--+索引值得唯一性+--索引名稱--+-索引列的序列號(hào)-+-對(duì)應(yīng)的字段 --+-----------+-------------+----------+--------+------+--索引的類型-+---------+---------------+ | users | 唯一 0 | PRIMARY | 1 | id | A | 2 | NULL | NULL | | BTREE | | | | users |不是唯一 1 | index_age | 1 | age | A | 3 | NULL | NULL | YES | BTREE | | | | users | 1 | index_name | 1 | name | A | 3 | NULL | NULL | | BTREE | | | +-------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
2、唯一索引(可以有多個(gè),對(duì)應(yīng)UNIQUE)
(1)與普通索引的區(qū)別是索引列的所有值必須唯一,但可以有空值;
(2)創(chuàng)建唯一索引的方式
create unique index 索引名稱 on 表名(字段名稱(字段長(zhǎng)度)); #unique:默認(rèn)字段
alter table 表名 add unique 索引名稱 (字段名稱(字段長(zhǎng)度));
示例
mysql> create table auth.kc31(id int(10) not null, #創(chuàng)建kc31表,存在3個(gè)字段 -> name char(20) not null, -> address varchar(30) default '', -> unique index index_address(address)); #unique:唯一性索引 mysql> use auth; mysql> desc kc31; #查看kc31表結(jié)構(gòu) | address | varchar(30) | YES | UNI | | | #address的UNI:唯一性索引 mysql> show keys from kc31; #查看Non_unique為0:代表唯一索引 mysql> insert into kc31 values('1','aaa','zhoukou'); #插入數(shù)據(jù) mysql> insert into kc31 values('2','bbb','zhoukou'); #驗(yàn)證address字段的唯一性 ERROR 1062 (23000): Duplicate entry 'zhoukou' for key 'index_address' #address字段zhoukou的關(guān)鍵字具有唯一性,所以不能創(chuàng)建 mysql> insert into kc31 values('2','bbb','luoyang'); #將zhoukou改為luoyang可以創(chuàng)建成功 mysql> insert into kc31 values('3','bbb','luohe'); #name字段不具有唯一性,可以創(chuàng)建 mysql> select * from kc31; +----+------+---------+ | id | name | address | +----+------+---------+ | 1 | aaa | zhoukou | | 2 | bbb | luoyang | | 3 | bbb | luohe | +----+------+---------+ #第二字段可以有重復(fù),第三字段因?yàn)橛形ㄒ恍圆荒苤貜?fù)
3、主鍵索引(只能有一個(gè),關(guān)鍵字PRIMARY)
(1)是一種也輸?shù)奈ㄒ凰饕?,指定?ldquo;PRIMARY KEY”
(2)一個(gè)表只能有一個(gè)主鍵,不允許有空值
(3)創(chuàng)建主鍵索引的方式
修改表的創(chuàng)建
alter table 表名 add primary key(字段名稱(字段長(zhǎng)度));
直接指定主鍵
create table 表名(字段1,字段2,primary key(指定字段名稱));
示例
mysql> create table auth.test(id int(10) not null, #創(chuàng)建test表 -> class char(20) not null, -> primary key(id)); #直接指定主鍵為id字段 mysql> desc test; | id | int(10) | NO | PRI | NULL | | #PRI主鍵索引 mysql> show index from test\G; *************************** 1. row *************************** Table: test #表名 Non_unique: 0 #索引唯一值 Key_name: PRIMARY #索引名稱,關(guān)鍵字;PRIMARY Column_name: id #id作為主鍵 mysql> alter table test drop primary key; #清空主鍵索引 mysql> show index from test #主鍵索引為空值 mysql> alter table test add primary key(class); #將test表的class添加為主鍵 mysql> show index from test #再查詢表結(jié)構(gòu),存在class主鍵
4、主鍵索引和唯一索引的區(qū)別
(1)主鍵索引一定是唯一性索引,但唯一性索引不一定是主鍵索引
(2)一張表可以有多個(gè)唯一性索引,但只允許有提個(gè)主鍵索引
(3)主鍵列不能為空,但唯一索引可以為空
(4)主鍵索引是一種特殊的唯一性索引
mysql> alter table test add primary key(id); #驗(yàn)證主鍵的唯一性 ERROR 1068 (42000): Multiple primary key defined #多余的主鍵沒有被定義,不能同時(shí)存在2個(gè)主鍵 mysql> alter table test add unique index_id(id); #創(chuàng)建id字段唯一性索引,可以有多個(gè)唯一性索引 mysql> show keys from test\G; #查看test存在2個(gè)唯一性索引 *************************** 1. row *************************** Table: test Non_unique: 0 Key_name: PRIMARY #主鍵索引 Column_name: class *************************** 2. row *************************** Table: test Non_unique: 0 Key_name: index_id #唯一索引 Column_name: id
5、組合索引(單列索引與多列索引)
(1)當(dāng)多條件查詢的時(shí)候我們可以使用組合索引,查詢效率會(huì)更高,因?yàn)楫?dāng)有多個(gè)單列索引時(shí),MySQL只能用到其中那個(gè)它認(rèn)為最有效率的單列索引
(2)支持最左原則,從左往右依次執(zhí)行
(3)創(chuàng)建組合索引的方式
create table 表名(字段1,字段2,字段3,index 索引名稱(字段1名稱 字段2名稱 字段3名稱));
示例
mysql> create table auth.kgc(name char(10) not null, #創(chuàng)建kgc表 -> passwd char(50) not null, -> sex int(10) not null, -> index index_kgc(name,passwd,sex)); #在name,passwd,sex創(chuàng)建組合索引 mysql> show index from kgc\G; #查看存在3個(gè)索引
6、全文索引
(1)索引類型為FULLTEXT
(2)可以在char、varchar或者test類型的列上創(chuàng)建
create fulltext index 索引名稱 on 表名(字段名稱(字段長(zhǎng)度));
alter table 表名 add fulltext index 索引名稱(字段名稱(字段長(zhǎng)度));
create table 表名(字段1,字段2,字段3,fulltext index 索引名稱(字段名稱(字段長(zhǎng)度));
示例
mysql> create table auth.content(id int(10) not null, -> title char(255) not null, -> time int(10) null, -> primary key(id), -> fulltext index_id(id)); ERROR 1283 (HY000): Column 'id' cannot be part of FULLTEXT index #id字段不是3種數(shù)據(jù)類型,不能在設(shè)置全文索引 mysql> create table auth.content(id int(10) not null, title char(255) not null, time int(10) null, primary key(id), fulltext index_id(title)); #替換為支持的數(shù)據(jù)類型即可 mysql> show index from content\G; *************************** 2. row *************************** Index_type: FULLTEXT #數(shù)據(jù)類型為全文索引
7、創(chuàng)建索引的依據(jù)
(1)表的主鍵、外鍵都必須有索引
(2)記錄數(shù)超過300行的表應(yīng)該有索引
(3)經(jīng)常與其他表進(jìn)行連接的表,在連接字段上應(yīng)該建立索引
(4)唯一性太差的字段不適合創(chuàng)建索引
(5)更新太頻繁的字段不適合創(chuàng)建索引
(6)將常出現(xiàn)再where子句中的字段,特別是大表的字段,應(yīng)該建立索引
(7)索引應(yīng)該建立在選擇性高的字段上
(8)索引應(yīng)該建在小字段上,對(duì)于大的文本字段甚至超長(zhǎng)字段,不要建索引
8、查看索引的方法
show index from 表名; show keys from 表名;
9、刪除索引的方法
drop index 索引名稱 on 表名; #刪除普通索引 alter table 表名 drop index 索引名稱; #刪除普通索引 alter table 表名 drop primary key; #刪除主鍵索引
示例
mysql> drop index index_id on content; #刪除content表下的index_id索引 mysql> alter table content drop primary key; #刪除ontent表下的主鍵索引 mysql> show index from content; Empty set (0.00 sec) #索引已刪除
三、MySQL事務(wù)
1、事務(wù)的概念
(1)是一種機(jī)制、一個(gè)操作的組合,包含了一組數(shù)據(jù)庫(kù)操作命令,并且把所有的命令作為一個(gè)整體一起向系統(tǒng)提交或撤銷操作請(qǐng)求,即這一組數(shù)據(jù)庫(kù)操作命令要么都執(zhí)行,要么都不執(zhí)行
(2)是一個(gè)不可分割的工作邏輯單元,在數(shù)據(jù)庫(kù)系統(tǒng)上執(zhí)行并發(fā)操作時(shí),事務(wù)是最小的控制單元
(3)適用于多用戶同時(shí)操作數(shù)據(jù)庫(kù)系統(tǒng)的場(chǎng)景,如銀行、保險(xiǎn)公司及證券交易系統(tǒng)等待
(4)通過事務(wù)的整體性以保證數(shù)據(jù)的一致性
2、事務(wù)的ACID特點(diǎn)
(1)原子性(Atomicity)
①事務(wù)是一個(gè)完整的操作,事務(wù)的各元素是不可分割的
②事務(wù)中的所有元素必須作為一個(gè)整體提交或回滾
③如果事務(wù)中的任何元素失敗,則整個(gè)事務(wù)將失敗
(2)一致性(Consistency)
①當(dāng)事務(wù)完成時(shí),數(shù)據(jù)必須處于一致狀態(tài)
②當(dāng)事務(wù)開始前,數(shù)據(jù)庫(kù)中存儲(chǔ)的數(shù)據(jù)處于一致狀態(tài)
③在正在執(zhí)行的事務(wù)中,數(shù)據(jù)可能處于不一致的狀態(tài)
④當(dāng)事務(wù)成功完成時(shí),數(shù)據(jù)必須再次回到已知的一致狀態(tài)
(3)隔離性(Isolation)
①對(duì)數(shù)據(jù)進(jìn)行修改的所有并發(fā)事務(wù)是彼此隔離的,表名事務(wù)必須是獨(dú)立的,它不應(yīng)以任何方式依賴于或影響其他事務(wù)
②修改數(shù)據(jù)的事務(wù)可在另一個(gè)使用相同數(shù)據(jù)的事務(wù)開始之前訪問這些數(shù)據(jù),或者在另一個(gè)使用相同數(shù)據(jù)的事務(wù)結(jié)束之后訪問這些數(shù)據(jù)
(4)持久性(Durability)
①值不管系統(tǒng)是否發(fā)生故障,事務(wù)處理的結(jié)果都是永久的
②一旦事務(wù)被提交,事務(wù)的效果會(huì)被永久地保留在數(shù)據(jù)庫(kù)中
3、事務(wù)控制語(yǔ)句
(1)MySQL事務(wù)默認(rèn)是自動(dòng)提交,當(dāng)SQL語(yǔ)句提交時(shí)事務(wù)遍自動(dòng)提交
(2)事務(wù)控制語(yǔ)句
①begin:開啟一個(gè)事務(wù)
②rollback:回滾一個(gè)事務(wù),回滾到 begen之前地狀態(tài)
③commit:提交一個(gè)事務(wù)
④savepoint identifier:在事務(wù)中創(chuàng)建一個(gè)保存點(diǎn),一個(gè)事務(wù)可以有多個(gè)savepoint
⑤release savepoint identifier:刪除一個(gè)事務(wù)的保存點(diǎn)(與保存的數(shù)據(jù)無(wú)影響)
⑥r(nóng)ollback to identifier:回滾到一個(gè)事務(wù)的保存點(diǎn)
⑦set transaction:用來(lái)設(shè)置事務(wù)的隔離級(jí)別
4、手動(dòng)對(duì)事務(wù)進(jìn)行控制的方法
(1)事務(wù)處理命令控制事務(wù)
①begin:開始一個(gè)事務(wù)
②commit:提交一個(gè)事務(wù)
③rollback:回滾一個(gè)事務(wù)(位于begin和commit之間)
(2)使用set命令進(jìn)行控制
①set autocommit=0:禁止自動(dòng)提交(手動(dòng)提交事務(wù))
②set autocommit=1:開啟自動(dòng)提交
5、實(shí)驗(yàn):手動(dòng)控制事務(wù)
(1)驗(yàn)證手動(dòng)控制事務(wù)不提交則不會(huì)保存
[root@localhost ~]# mysql -uroot -p #啟動(dòng)數(shù)據(jù)庫(kù) mysql> create database imployee_salary; #創(chuàng)建imployee_salary數(shù)據(jù)庫(kù) mysql> use imployee_salary; #進(jìn)入imployee_salary數(shù)據(jù)庫(kù) mysql> create table IT_salary(員工ID char(10), -> 崗位類別 char(20), -> 姓名 char(10), -> 年齡 char(10), -> 學(xué)歷 char(10), -> 薪資 char(10), -> primary key(員工ID)); mysql> desc it_salary; +--------------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------------+----------+------+-----+---------+-------+ | 員工ID | char(10) | NO | PRI | NULL | | | 崗位類別 | char(20) | YES | | NULL | | | 姓名 | char(10) | YES | | NULL | | | 年齡 | char(10) | YES | | NULL | | | 學(xué)歷 | char(10) | YES | | NULL | | | 薪資 | char(10) | YES | | NULL | | +--------------+----------+------+-----+---------+-------+ mysql> begin; #開啟事務(wù) mysql> insert into it_salary values('1','硬件工程師','小王','22','???,'8000'); mysql> insert into it_salary values('2','windows工程師','小張','23','本科','9000'); mysql> insert into it_salary values('4','Linux工程師','小楊','25','本科','12000'); mysql> select * from it_salary; +----------+------------------+--------+--------+--------+--------+ | 員工ID | 崗位類別 | 姓名 | 年齡 | 學(xué)歷 | 薪資 | +----------+------------------+--------+--------+--------+--------+ | 1 | 硬件工程師 | 小王 | 22 | 專科 | 8000 | | 2 | windows工程師 | 小張 | 23 | 本科 | 9000 | | 4 | Linux工程師 | 小楊 | 25 | 本科 | 12000 | +----------+------------------+--------+--------+--------+--------+ mysql> exit #退出 [root@localhost ~]# mysql -uroot -p #重新登錄數(shù)據(jù)庫(kù) mysql> show tables from imployee_salary; #能夠查到it_salary數(shù)據(jù)表 mysql> select * from it_salary; #數(shù)據(jù)已經(jīng)不存在 說(shuō)明:此時(shí)數(shù)據(jù)庫(kù)中并沒有之前插入的數(shù)據(jù),說(shuō)明使用begin開啟服務(wù),執(zhí)行數(shù)據(jù)操作語(yǔ)句后,必須使用commit提交事務(wù),否則數(shù)據(jù)是不能自動(dòng)提交的。 (2)rollback(回滾)的使用 mysql> use imployee_salary; mysql> begin; #開啟事務(wù) mysql> insert into it_salary values('1','硬件工程師','小王','22','???,'8000'); mysql> insert into it_salary values('2','windows工程師','小張','23','本科','9000'); mysql> select * from it_salary; #存在添加的兩行數(shù)據(jù) mysql> rollback; #回滾事務(wù) mysql> select * from it_salary; #數(shù)據(jù)已經(jīng)不存在 說(shuō)明:使用begin開始事務(wù),然后執(zhí)行了插入語(yǔ)句后可以看到插入的數(shù)據(jù),但是執(zhí)行rollback回滾命令后,之前的數(shù)據(jù)已經(jīng)沒有了 (3)savepoint(定義回滾點(diǎn))的使用 mysql> begin; #開啟事務(wù) mysql> insert into it_salary values('1','硬件工程師','小王','22','???,'8000'); #插入一個(gè)數(shù)據(jù) mysql> savepoint s1; #定義s1回滾點(diǎn) mysql> insert into it_salary values('2','windows工程師','小張','23','本科','9000'); #插入第二個(gè)數(shù)據(jù) mysql> savepoint s2; #定義s2回滾點(diǎn) mysql> select * from it_salary; #存在插入的2行數(shù)據(jù)
如果后面執(zhí)行rollback命令,這兩條數(shù)據(jù)都將丟失。
mysql> rollback to savepoint s1; #回滾到s1 mysql> select * from it_salary; #只存在一條數(shù)據(jù) +----------+-----------------+--------+--------+--------+--------+ | 員工ID | 崗位類別 | 姓名 | 年齡 | 學(xué)歷 | 薪資 | +----------+-----------------+--------+--------+--------+--------+ | 1 | 硬件工程師 | 小王 | 22 | 專科 | 8000 | +----------+-----------------+--------+--------+--------+--------+ mysql> rollback to savepoint s2; #嘗試回滾到s2 ERROR 1305 (42000): SAVEPOINT s2 does not exist #數(shù)據(jù)無(wú)法回滾 說(shuō)明:回滾到s1,第一條插入的數(shù)據(jù)可以查詢出來(lái),但是無(wú)法回退到s2了 (4)使用set命令控制事務(wù) mysql> set autocommit=0; #改為手動(dòng)提交事務(wù) mysql> insert into it_salary values('2','windows工程師','小張','23','本科','9000'); mysql> commit; #提交事務(wù),數(shù)據(jù)永久保存 說(shuō)明:若commit提交事務(wù)后,則數(shù)據(jù)無(wú)法進(jìn)行回滾
四、存儲(chǔ)引擎
1、存儲(chǔ)引擎介紹
(1)MySQL中的數(shù)據(jù)用各種不同地技術(shù)存儲(chǔ)在文件中,每一種技術(shù)都使用不同的存儲(chǔ)機(jī)制、索引技巧、鎖定水平并最終提供不同的功能和能力,這些不同的技術(shù)以及配套地功能在MySQL中稱為存儲(chǔ)引擎
(2)存儲(chǔ)引擎是MySQL將數(shù)據(jù)存儲(chǔ)在文件系統(tǒng)中的存儲(chǔ)方式或者存儲(chǔ)格式
(3)MySQL常用的存儲(chǔ)方式
①M(fèi)yISAM;②innoDB
(4)MySQL數(shù)據(jù)庫(kù)中的組件,負(fù)責(zé)執(zhí)行實(shí)際的數(shù)據(jù)I/O操作
(5)MySQL系統(tǒng)中,存儲(chǔ)引擎處于文件系統(tǒng)之上,在數(shù)據(jù)保存到文件系統(tǒng)之前會(huì)傳輸?shù)酱鎯?chǔ)引擎,之后按照各個(gè)存儲(chǔ)引擎的存儲(chǔ)格式進(jìn)行儲(chǔ)存
2、MyISAM的介紹
(1)MyISAM不支持事務(wù),也不支持外鍵
(2)訪問速度快
(3)對(duì)事務(wù)完整性沒有要求
(4)MyISAM在磁盤上存儲(chǔ)成三個(gè)文件
①表結(jié)構(gòu)文件(.frm文件)
②數(shù)據(jù)文件的擴(kuò)展名為.MYD(MYData)
③索引文件的擴(kuò)展名是.MYI(MYIndex)
(5)表級(jí)鎖定形式,數(shù)據(jù)在更新時(shí)鎖定整個(gè)表
(6)數(shù)據(jù)庫(kù)在讀寫過程中相互阻塞
①會(huì)在數(shù)據(jù)寫入的過程中阻塞用戶數(shù)據(jù)的讀取
②也會(huì)在數(shù)據(jù)讀取的過程中阻塞用戶的數(shù)據(jù)寫入
(7)數(shù)據(jù)單獨(dú)寫入或讀取,速度較快且占用資源相對(duì)少
(8)MyIAM支持的存儲(chǔ)格式
①靜態(tài)表;②動(dòng)態(tài)表;③壓縮表
3、MyISAM適用的生產(chǎn)場(chǎng)景
(1)公司業(yè)務(wù)不需要事務(wù)的支持
(2)單方面讀取或?qū)懭霐?shù)據(jù)比較多的業(yè)務(wù)
(3)MyISAM存儲(chǔ)引擎不適合數(shù)據(jù)讀寫都比較頻繁的場(chǎng)景
(4)對(duì)數(shù)據(jù)業(yè)務(wù)一致性要求不是非常高的業(yè)務(wù)
(5)服務(wù)器硬件資源相對(duì)比較差
4、innoDB特點(diǎn)介紹
(1)支持事務(wù)
(2)行級(jí)鎖定,提高數(shù)據(jù)庫(kù)并發(fā)訪問性能
(3)非常高效的緩存索引和數(shù)據(jù)
(4)支持外鍵約束,5.5版本后支持全文索引
(5)對(duì)硬件資源要求比較高的場(chǎng)合
5、innoDB適用生產(chǎn)場(chǎng)景分析
(1)業(yè)務(wù)需要事務(wù)的支持
(2)行級(jí)鎖定對(duì)高并發(fā)有很好的適應(yīng)能力,但需確保查詢是通過索引來(lái)完成
(3)業(yè)務(wù)數(shù)據(jù)更新較為頻繁的場(chǎng)景,如:論壇,微博等
(4)業(yè)務(wù)數(shù)據(jù)一致性要求較高,如:銀行業(yè)務(wù)
(5)硬件設(shè)備內(nèi)存較大,利用lnnodb較好的緩存能力來(lái)提高內(nèi)存利用率,減少磁盤IO的壓力
6、企業(yè)選擇存儲(chǔ)引擎依據(jù)
(1)需要考慮每個(gè)存儲(chǔ)引擎提供的核心功能及應(yīng)用場(chǎng)景
(2)支持的字段和數(shù)據(jù)類型
(3)鎖定類型:不同的存儲(chǔ)引擎支持不同級(jí)別的鎖定
(4)索引的支持
(5)事務(wù)處理的支持
7、查看存儲(chǔ)引擎
(1)查看MySQL默認(rèn)的存儲(chǔ)引擎
mysql> show engines; #默認(rèn)存在9款存儲(chǔ)引擎 +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | Engine | Support | Comment | Transactions | XA | Savepoints | +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES | | MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO | | MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO | | BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO | | MyISAM | YES | MyISAM storage engine | NO | NO | NO | | CSV | YES | CSV storage engine | NO | NO | NO | | ARCHIVE | YES | Archive storage engine | NO | NO | NO | | PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO | | FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL | +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ mysql> show variables like '%storage_engine%'; (2)查看表正在使用的存儲(chǔ)引擎 mysql> show table status where name='表名'; mysql> show create table 表名;
8、修改存儲(chǔ)引擎
(1)alter table 修改 (準(zhǔn)對(duì)以創(chuàng)建的表)
mysql> alter table user_info engine=引擎;
(2)修改my.cnf文件,指定默認(rèn)存儲(chǔ)引擎并重新啟動(dòng)(針對(duì)新創(chuàng)建的表,舊表不影響存儲(chǔ)引擎)
[root@localhost ~]# vim /etc/my.cnf default-storage-engine=INNODB [root@localhost ~]# systemctl restart mysqld
(3)create table創(chuàng)建表時(shí)指定存儲(chǔ)引擎
mysql> create table 表名(字段1) engine=引擎;
(4)臨時(shí)修改存儲(chǔ)引擎
mysql> set default_storage_engine=引擎;
到此這篇關(guān)于mysql 添加索引的實(shí)現(xiàn)步驟的文章就介紹到這了,更多相關(guān)mysql 添加索引內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mysql插入數(shù)據(jù)方式(insert into 、replace into解析)
這篇文章主要介紹了Mysql插入數(shù)據(jù)方式(insert into 、replace into解析),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01數(shù)據(jù)結(jié)構(gòu)-樹(三):多路搜索樹B樹、B+樹
這篇文章主要介紹了多路搜索樹B樹、B+樹,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04MySQL之information_schema數(shù)據(jù)庫(kù)詳細(xì)講解
這篇文章主要介紹了MySQL之information_schema數(shù)據(jù)庫(kù)詳細(xì)講解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08打開和關(guān)閉mysql服務(wù)的兩種實(shí)現(xiàn)方法
這篇文章主要介紹了打開和關(guān)閉mysql服務(wù)的兩種實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-07-07