今天的內(nèi)容:
1.建庫(kù) 建表
2.介紹 增刪改
3.索引 Btree+
第1章 建表語(yǔ)句
1.建表語(yǔ)句
SQL語(yǔ)句:
2.引擎
InnoDB 默認(rèn)新的引擎
MyISAM? mysql系統(tǒng)庫(kù)用的是他
3.主鍵
PRIMARY KEY
每個(gè)表都必須包含一個(gè)主鍵列
主鍵特性:
唯一 不能重復(fù)
非空
自增
3.字符集
默認(rèn) latin1
常用 UTF8
推薦 utf8mb4 emoji
4.字段類(lèi)型
數(shù)字類(lèi)型:
整數(shù):
tinyint? 1字節(jié)? =? 8位 = 00000000 - 11111111? = 2^8個(gè)? = 0? - 255? ? , -127-128? ?
int? ? ? 4字節(jié)? =? 32位? ? ? ? ? ? ? ? ? ? ? = 2^32個(gè) = 0? - 2^32-1? ,-2^31-2^31-1 ,10位數(shù)
bigint? ? 8字節(jié)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 0? - 2^64-1? ,-2^63-2^63-1 ,20位數(shù)
浮點(diǎn)數(shù):
decimal(m,n)
字符串類(lèi)型:
char(N)? ? :
N字符個(gè)數(shù),最大不超過(guò)255
定長(zhǎng)的字符串類(lèi)型蟀俊。
例如: char(10) ,最多存10個(gè)字符,只要10個(gè)字符以?xún)?nèi)效诅,都10個(gè)字符長(zhǎng)度的存儲(chǔ)空間。剩余用空格填充。
varchar(M) :
M字符個(gè)數(shù)妓盲,最大不超過(guò)65535
變長(zhǎng)的字符串類(lèi)型谷遂。會(huì)額外占用1-2字節(jié)存儲(chǔ)字符長(zhǎng)度。255字符之內(nèi)砍艾,額外1字節(jié)蒂教,255以上,額外2字節(jié)
例如: varchar(10),最多存10個(gè)字符,按需分配存儲(chǔ)空間脆荷。
abc 3? ? ? ? ? ? =4
asdasdadasd 1000? =1002
5.建表語(yǔ)句
CREATE TABLE `school`.`linux`(
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '學(xué)號(hào)',
`name` CHAR(10) NOT NULL COMMENT '姓名',
`age` TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '年齡',
`ssex` ENUM('F','M','Y') NOT NULL DEFAULT 'Y' COMMENT '性別',
`address` VARCHAR(20) NOT NULL COMMENT '地址',
PRIMARY KEY (`id`) ) ENGINE=INNODB CHARSET=utf8mb4;
第2章 插入語(yǔ)句
第一種寫(xiě)法:
INSERT INTO `school`.`linux` (`id`, `name`, `age`, `ssex`, `address`)
VALUES ('1', '張亞', '29', 'M', '深圳南山區(qū)');
第二種寫(xiě)法:
INSERT INTO `school`.`linux`
VALUES ('1', '張亞', '29', 'M', '深圳南山區(qū)');
第三種寫(xiě)法:
INSERT INTO `school`.`linux` (`name`, `age`, `ssex`, `address`)
VALUES ('張亞', '29', 'M', '深圳南山區(qū)');
第3章 修改語(yǔ)句
1.修改表名-不要用
RENAME TABLE `school`.`linux` TO `school`.`linux7`;
2.修改列名-不要用
改列名:
ALTER TABLE `school`.`linux`
CHANGE `ssex` `sex`
ENUM('F','M','Y')
CHARSET utf8mb4
COLLATE utf8mb4_general_ci
DEFAULT 'Y'
NOT NULL
COMMENT '性別';
3.修改表數(shù)據(jù)-不要用
注意!!!修改表數(shù)據(jù)一定要加上限定條件!!!注意
UPDATE `school`.`linux7` SET `name` = '張亞男' WHERE `id` = '29';
4.增加字段
ALTER TABLE `school`.`linux7` ADD COLUMN `status`
ENUM('1','0') NOT NULL COMMENT '刪除狀態(tài)'
AFTER `address`;
第4章 刪除語(yǔ)句-不要用
1.刪數(shù)據(jù)
注意!!!刪除表數(shù)據(jù)一定要加上限定條件!!!注意
DELETE FROM `school`.`linux7` WHERE `id` = '29';
2.偽刪除
第一步: 增加一個(gè)狀態(tài)字段
ALTER TABLE `school`.`linux7` ADD COLUMN `status`
ENUM('1','0') NOT NULL COMMENT '刪除狀態(tài),0刪除,1存在'
AFTER `address`;
第二步: 改造業(yè)務(wù)的查詢(xún)語(yǔ)句
SELECT * FROM linux7 WHERE STATUS = '1';
第三步: 改造業(yè)務(wù)的刪除邏輯-將刪除替換為更新
UPDATE `school`.`linux7` SET `status` = '1' WHERE `id` = '1';
3.刪字段-不要會(huì)
ALTER TABLE `school`.`linux7` DROP COLUMN `status`;
4.刪表-不要會(huì)
DROP TABLE `school`.`linux7`;
5.刪庫(kù)-沒(méi)教過(guò)
DROP DATABASE `school`;
第5章 索引
1.什么叫索引
假如表是一本書(shū),索引就是這本書(shū)的目錄
數(shù)據(jù)庫(kù)索引的目的就是為了更快的找到我們要的數(shù)據(jù)
2.平衡樹(shù)
BTREE
B+TREE
B++TREE
3.前提
1)如果表中設(shè)置了主鍵(例如ID列)凝垛,自動(dòng)根據(jù)ID列生成索引樹(shù)懊悯。
2)如果沒(méi)有設(shè)置主鍵,自動(dòng)選擇第一個(gè)唯一鍵的列作為聚簇索引
3)自動(dòng)生成隱藏的聚簇索引梦皮。
4.構(gòu)建過(guò)程
1)葉子節(jié)點(diǎn): 存儲(chǔ)數(shù)據(jù)行時(shí)就是有序的炭分,直接將數(shù)據(jù)行的page作為葉子節(jié)點(diǎn)(相鄰的葉子結(jié)點(diǎn),有雙向指針)
2)枝節(jié)點(diǎn): 提取葉子節(jié)點(diǎn)ID的范圍+指針剑肯,構(gòu)建枝節(jié)點(diǎn)(相鄰枝節(jié)點(diǎn)捧毛,有雙向指針)
3)根節(jié)點(diǎn): 提取枝節(jié)點(diǎn)的ID的范圍+指針,構(gòu)建根節(jié)點(diǎn)
5.查詢(xún)語(yǔ)句
查詢(xún)的語(yǔ)句條件為id列這樣是最快的,因?yàn)檫@樣直接就可以根據(jù)索引很快查到數(shù)據(jù)存儲(chǔ)的位置
第6章 輔助索引
1.條件
需要人為創(chuàng)建輔助索引让网,將經(jīng)常作為查詢(xún)條件的列創(chuàng)建輔助索引呀忧,起到加速查詢(xún)的效果。
2.功能
按照輔助索引列溃睹,作為查詢(xún)條件時(shí)而账。
1.查找輔助索引樹(shù),得到ID值
2.拿著ID值回表(聚簇索引)查詢(xún)
3.輔助索引生成過(guò)程
1.葉子節(jié)點(diǎn):提取主鍵(ID)+輔助索引列因篇,按照輔助索引列進(jìn)行從小到大排序后泞辐,生成葉子節(jié)點(diǎn)。(相鄰的葉子結(jié)點(diǎn)竞滓,有雙向指針)
2.枝節(jié)點(diǎn)? :提取葉子節(jié)點(diǎn)輔助索引列的范圍+指針咐吼,構(gòu)建枝節(jié)點(diǎn)(相鄰枝節(jié)點(diǎn),有雙向指針)
3.根節(jié)點(diǎn)? :提取枝節(jié)點(diǎn)的輔助索引列的范圍+指針虽界,構(gòu)建根節(jié)點(diǎn)
第7章 索引應(yīng)用
1.壓測(cè)
mysql -uroot -padmin < t100w.sql
mysqlslap \
--defaults-file=/etc/my.cnf \
--concurrency=100 \
--iterations=1 \
--create-schema='test' \
--query="select * from test.t100w where k2='780P'" \
engine=innodb \
--number-of-queries=2000 \
-uroot -p123 \
-verbose -S /tmp/mysql_3306.sock
mysqlslap \
--defaults-file=/etc/my.cnf \
--concurrency=100 \
--iterations=1 \
--create-schema='test' \
--query="select * from test.t100w where id='780P'" \
engine=innodb \
--number-of-queries=200 \
-uroot -padmin \
-verbose -S /tmp/mysql_3306.sock
2.查看索引
desc t100w;?
show index from t100w;
3.創(chuàng)建輔助索引
select * from test.t100w where k2='780P'
alter table t100w add index idx_k2(k2);