🏠个人主页:不会写代码的满满
🧑个人简介:大家好,我是满满,一个想要与大家共同进步的男人😉😉
目前状况🎉:开学即将大三,目标就是半年内找到一份实习工作👏👏
💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,我亲爱的大佬😘
正文开始 ----------
索引这个东西,在我还没接触到MySQL的学习中,就已经听到无数次了,现在正好赶上了MySQL阶段的学习,那就一起来啃一啃索引这个硬骨头!!!
可以毫不夸张的说,系统中 SQL 的好坏,是能直接决定你系统的快慢的。但是在优化之前大家是否想过一个问题?
那就是:我们优化的原则是什么? 优化SQL的理论基础是什么?
所以说了这么多只想告诉大家,在真正的开始索引优化之前,我们需要彻底搞明白索引的原理。这样再谈优化你将觉得更丝滑~

索引的本质是一种排好序的数据结构。这个我相信其实大家并不陌生,因为谈到索引很多人自然而然的就会联想到字典中或者是文章中的目录。
下面谈谈我对索引的看法吧
索引是对数据库表中的字段 (可以是一个字段也可以是多个字段)的值进行排序的数据结构。索引就像一个数的目录一样,可以快速访问我们想要访问的目录,在数据库中就是可以快速访问到数据库表中具有一定特点的数据信息。这个只是索引的表面,实际上索引的底层是一些高级的数据结构,只不过我们看不到,在数据库中已经帮我们写好了,在数据库中其实有很多种类的数据结构,常见的有
平衡二叉树,红黑树,Hash表,B+树等,但是在MySQL数据库中主要是B+树。
索引可以大大提高MySQL的检索速度,为什么不对表中的每一个列创建一个索引呢?
优点缺点索引是建立在数据库表中的某些列的上面。因此,在创建索引的时候,应该仔细考虑在哪些列上可以创建索引,在哪些列上不能创建索引。
应该创建索引的列不该创建索引的列即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。主键索引:一张表只能有一个主键索引,不允许重复、不允许为 NULL;
ALTER TABLE TableName ADD PRIMARY KEY(column_list);
唯一索引:数据列不允许重复,允许为 NULL 值,一张表可有多个唯一索引,索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。
CREATE UNIQUE INDEX IndexName ON `TableName` (`字段名`(length));
或者
ALTER TABLE TableName ADD UNIQUE (column_list);
普通索引:一张表可以创建多个普通索引,一个普通索引可以包含多个字段,允许数据重复,允许 NULL 值插入;
CREATE INDEX IndexName ON `TableName`(`字段名`(length));
或者
ALTER TABLE TableName ADD INDEX IndexName(`字段名`(length));
全文索引:它查找的是文本中的关键词,主要用于全文检索。
一般很少用
全文索引:FULLTEXT索引用于全文搜索。只有InnoDB和 MyISAM存储引擎支持,FULLTEXT索引仅适用于 CHAR, VARCHAR和 TEXT列。
创建全文索引
drop table if exists tc_10;
create table tc_10(
aaa int primary key,
bbb varchar(20),
ccc datetime,
fulltext i_tc10_a(bbb)
);
alter table tc_10 add fulltext i_tc10_b(bbb);
删除全文索引,与删除普通索引一致。
drop index i_tc10_b on tc_10;
索引名称 index_name 是可以省略的,省略后,索引的名称和索引列名相同。
-- 创建普通索引
CREATE INDEX index_name ON table_name(col_name);
-- 创建唯一索引
CREATE UNIQUE INDEX index_name ON table_name(col_name);
-- 创建普通组合索引
CREATE INDEX index_name ON table_name(col_name_1,col_name_2);
-- 创建唯一组合索引
CREATE UNIQUE INDEX index_name ON table_name(col_name_1,col_name_2);
ALTER TABLE table_name ADD INDEX index_name(col_name);
CREATE TABLE table_name (
ID INT NOT NULL,
col_name VARCHAR (16) NOT NULL,
INDEX index_name (col_name)
);
-- 直接删除索引
DROP INDEX index_name ON table_name;
-- 修改表结构删除索引
ALTER TABLE table_name DROP INDEX index_name;
删除唯一索引的方法与删除普通索引相同。
-- 查看表结构
desc table_name;
-- 查看生成表的SQL
show create table table_name;
-- 查看索引信息(包括索引结构等)
show index from table_name;
-- 查看SQL执行时间(精确到小数点后8位)
set profiling = 1;
SQL...
show profiles;