MySQL06-- mysql索引

一.索引介紹

1.什麼是索引

1)索引就比如一本書的目錄,它能讓你更快的找到本身想要的內容。
2)讓獲取的數據更有目的性,從而提升數據庫檢索數據的性能。sql

2.索引類型介紹

1)BTREE:B+樹索引 ( Btree B+tree B*tree)
2)HASH:HASH索引 (hash key)
3)FULLTEXT:全文索引
4)RTREE:R樹索引shell

1.Btree :
數據庫

2.Btree索引(優化了查詢範圍,在葉子節點添加了相鄰節點的指針)
性能

3·B*tree索引(在枝節點添加了指針)
優化

3.索引管理

索引創建在表的列上(字段)的。
在where後面的列創建索引纔會加快查詢速度。
pages<---索引(屬性)<----查數據。網站

  • 一、索引分類:

主鍵索引(primary key)
普通索引 ( key)
惟一索引(unique key)ui

  • 二、添加索引:

### 4.實例(參考)指針

CREATE TABLE `test_table` (
            `ID` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵',
            `DOMAIN_CODE` varchar(20) NOT NULL COMMENT '考試單位編號',
            `EXAM_NAME` varchar(300) NOT NULL COMMENT '考試名稱',
            `EXAM_TYPE` int(1) NOT NULL COMMENT '考試類型(正式考試,補考)',
            `TARGET_EXAM_ID` bigint(20) DEFAULT NULL COMMENT '關聯正式考試的ID(若是是補考,該處是必填)',
            `EXAM_PICTURE_PATH` varchar(100) DEFAULT NULL COMMENT '圖示路徑',
            `EXAM_BEGIN_TIME` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '考試開始時間',
            `EXAM_END_TIME` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '考試結束時間',
            `EXAM_TIME` int(3) NOT NULL COMMENT '考試時長',
            `EXAM_NEED_SCORE` int(5) NOT NULL COMMENT '考試所需積分',
            `EXAM_PAPER_TYPE` int(1) DEFAULT NULL COMMENT '考試試卷類型(0固定、1隨機)',
            `EXAM_SCORE` double(6,2) DEFAULT NULL COMMENT '考試總分(關聯試卷後回填)',
            `EXAM_PASS_SCORE` double(6,2) NOT NULL COMMENT '考試及格分',
            `EXAM_COMMIT_NUM` int(2) NOT NULL COMMENT '參考最大次數',
            `EXAM_STATUS` int(1) NOT NULL COMMENT '發佈狀態0未發佈,1已發佈',
            `EXAM_YEAR` varchar(5) NOT NULL COMMENT '年份',
            `EXAM_PAPER_ID` bigint(20) DEFAULT NULL COMMENT '關聯試卷ID',
            `EXAM_DISCRIPTION` varchar(1000) DEFAULT NULL COMMENT '考試備註',
            `OPERATOR_USER_ACCOUNT` varchar(20) NOT NULL COMMENT '修改人',
            `OPERATOR_TIME` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '修改時間',
            `TARGET_DOMAIN_CODE` varchar(20) DEFAULT NULL COMMENT '發佈目標單位編號(發佈時回填)',
            `RANK` varchar(100) DEFAULT NULL COMMENT '職務級別(發佈時回填)',
            `EXAM_DIPLOMA_ID` bigint(20) DEFAULT NULL COMMENT '關聯證書',
            `DIPLOMA_NAME` varchar(200) DEFAULT NULL COMMENT '證書標題(關聯證書後回填',
            `DIPLOMA_PICTURE_PATH` varchar(200) DEFAULT NULL COMMENT '證書背景圖片保存位置(關聯證書後回填)',
            `INDUSTRY_CODES` varchar(1000) DEFAULT NULL,
            `LANGUAGE` int(2) NOT NULL DEFAULT '1' COMMENT '语言(0:全部,1:汉语,2:维语,3:è’语,4:å「ˆè¯­ï¼‰',
            `EXT1` int(1) NOT NULL DEFAULT '1' COMMENT '成績計入學分的字段標識(0 是,1否)',
            `EXT2` int(3) DEFAULT NULL COMMENT '成績所佔比例',
            `EXT3` varchar(1) DEFAULT NULL,
            `EXT4` varchar(1) DEFAULT NULL,
            `EXT5` varchar(1) DEFAULT NULL,
            
            #索引
            PRIMARY KEY (`ID`),
            KEY `DOMAIN_CODE` (`DOMAIN_CODE`),
            KEY `EXAM_PAPER_ID` (`EXAM_PAPER_ID`)
            ) ENGINE=InnoDB AUTO_INCREMENT=365 DEFAULT CHARSET=utf8;

5.索引操做

#建立普通索引
mysql> alter table student4 add index idx_sname(sname);
#建立主鍵索引 
mysql> alter table st add primary key pri_id(id);
#建立索引
create index index_name on test(name);
#刪除索引
alter table test drop key index_name;

# 如何判斷,該列是否能建立惟一鍵 
#統計行數
mysql> select count(sgender) from student2; 
#統計去重後的行數
mysql> select count(distinct(sgender)) from student2;
#添加惟一性索引
alter table student add unique key uni_xxx(xxx);
#查看錶中數據行數
select count(*) from city;
#查看去重數據行數
select count(distinct name) from city;

#查看索引三種方式
mysql> desc student4;
mysql> show index from student4;
mysql> show create table student4;



6.前綴索引

根據字段的前N個字符創建索引code

#建立前綴索引 
mysql> alter table student2 add index idx_sname2(sname(3));

1.避免對大列 建索引
2.若是有,就使用前綴索引

7.聯合索引

多個字段創建一個索引

例:
where a.女生 and b.身高 and c.體重 and d.身材好
index(a,b,c)
特色:前綴生效特性
a,ab,ac,abc,abcd 能夠走索引或部分走索引
b bc bcd cd c d ba ... 不走索引

原則:把最經常使用來作爲條件查詢的列放在最前面

例如:想親網站 sex money body age hight weight face name phone QQ wechat

會通常把sex 性別放在第一位。

#建立people表
create table xiangqin( id, name varchar(10), age int, money bigint, body varchar(10), hight int, weight int, face varchar(10), phone varchar(11), sex enum('f','m')); 
#建立聯合索引 
mysql> alter table xiangqin add index idx_all(sex,money,body,face); 
insert into xiangqin values('ly',30,999999999,'perfact',158,90,'nice','133','f'), ('qbl',58,1000000,'bad',150,150,'very bad','000','f'), ('wbq',50,9999999,'suibian',170,120,'suiyi',132,'m');
#查詢 
走索引
mysql> select * from xiangqin where sex='f' and money>10000000 and body='perfact' and face='nice'; 
不走索引
mysql> select * from xiangqin where money>10000000 and body='perfact' and face='nice'; mysql> select * from xiangqin where money>10000000 and body='perfact' and face='nice' and sex='f';

8.建立索引總結:

1.不要在全部字段上都建立索引

** 2.若是有需求字段比較多,選擇聯合索引 **

3.若是有需求字段數據比較大,選擇前綴索引

4.若是能夠建立惟一索引,必定建立惟一索引

相關文章
相關標籤/搜索