• Mysql索引的创建与设计原则


    1. 索引的声明与使用

    1.1 索引的分类

    MySQL的索引包括普通索引、唯一性索引、全文索引、单列索引、多列索引和空间索引等。

    • 从功能逻辑 上说,索引主要有 4 种,分别是普通索引、唯一索引、主键索引、全文索引。
    • 按照物理实现方式 ,索引可以分为 2 种:聚簇索引和非聚簇索引。
    • 按照作用字段个数 进行划分,分成单列索引和联合索引。

    1. 普通索引

    2. 唯一性索引

    3. 主键索引

    4. 单列索引

    5. 多列(组合、联合)索引

    6. 全文索引

    7. 补充:空间索引

    小结:不同的存储引擎支持的索引类型也不一样

    InnoDB :支持 B-tree、Full-text 等索引,不支持 Hash 索引;

    MyISAM : 支持 B-tree、Full-text 等索引,不支持 Hash 索引;

    Memory :支持 B-tree、Hash 等 索引,不支持 Full-text 索引;

    NDB :支持 Hash 索引,不支持 B-tree、Full-text 等索引;

    Archive :不支 持 B-tree、Hash、Full-text 等索引;

    1.2 创建索引

    1.创建表的时候创建索引

    代码示例:

    1. CREATE TABLE dept(
    2. dept_id INT PRIMARY KEY AUTO_INCREMENT,
    3. dept_name VARCHAR(20)
    4. );
    5. CREATE TABLE emp(
    6. emp_id INT PRIMARY KEY AUTO_INCREMENT,
    7. emp_name VARCHAR(20) UNIQUE,
    8. dept_id INT,
    9. CONSTRAINT emp_dept_id_fk FOREIGN KEY(dept_id) REFERENCES dept(dept_id)
    10. );

    但是,如果显式创建表时创建索引的话,基本语法格式如下:

    1. CREATE TABLE table_name [col_name data_type]
    2. [UNIQUE | FULLTEXT | SPATIAL] [INDEX | KEY] [index_name] (col_name [length]) [ASC |
    3. DESC]
    • UNIQUE 、 FULLTEXT 和 SPATIAL 为可选参数,分别表示唯一索引、全文索引和空间索引;
    • INDEX 与 KEY 为同义词,两者的作用相同,用来指定创建索引;
    • index_name 指定索引的名称,为可选参数,如果不指定,那么MySQL默认col_name为索引名;
    • col_name 为需要创建索引的字段列,该列必须从数据表中定义的多个列中选择;
    • length 为可选参数,表示索引的长度,只有字符串类型的字段才能指定索引长度;
    • ASC 或 DESC 指定升序或者降序的索引值存储。
    • 创建普通索引

    在book表中的year_publication字段上建立普通索引,SQL语句如下:

    1. CREATE TABLE test1(
    2. id INT NOT NULL,
    3. name varchar(30) NOT NULL,
    4. UNIQUE INDEX uk_idx_id(id)
    5. );

     该语句执行完毕之后,使用SHOW CREATE TABLE查看表结构:

    SHOW INDEX FROM test1 \G
    • 创建唯一索引
    1. CREATE TABLE test1(
    2. id INT NOT NULL,
    3. name varchar(30) NOT NULL,
    4. UNIQUE INDEX uk_idx_id(id)
    5. );

      该语句执行完毕之后,使用SHOW CREATE TABLE查看表结构:

    SHOW INDEX FROM test1 \G
    • 主键索引

    设定为主键后数据库会自动建立索引,innodb为聚簇索引,语法:

    随表一起建索引:

    1. CREATE TABLE student (
    2. id INT(10) UNSIGNED AUTO_INCREMENT ,
    3. student_no VARCHAR(200),
    4. student_name VARCHAR(200),
    5. PRIMARY KEY(id)
    6. );

    删除主键索引:

    1. ALTER TABLE student
    2. drop PRIMARY KEY ;

     修改主键索引:必须先删除掉(drop)原索引,再新建(add)索引

    • 创建单列索引
    1. CREATE TABLE test2(
    2. id INT NOT NULL,
    3. name CHAR(50) NULL,
    4. INDEX single_idx_name(name(20))
    5. );

     该语句执行完毕之后,使用SHOW CREATE TABLE查看表结构:

    SHOW INDEX FROM test2 \G
    
    • 创建组合索引

    举例:创建表test3,在表中的id、name和age字段上建立组合索引,SQL语句如下:

    1. CREATE TABLE test3(
    2. id INT(11) NOT NULL,
    3. name CHAR(30) NOT NULL,
    4. age INT(11) NOT NULL,
    5. info VARCHAR(255),
    6. INDEX multi_idx(id,name,age)
    7. );

    该语句执行完毕之后,使用SHOW INDEX 查看:

    SHOW INDEX FROM test3 \G
    
    • 创建全文索引

    举例1:创建表test4,在表中的info字段上建立全文索引,SQL语句如下:

    1. CREATE TABLE test4(
    2. id INT NOT NULL,
    3. name CHAR(30) NOT NULL,
    4. age INT NOT NULL,
    5. info VARCHAR(255),
    6. FULLTEXT INDEX futxt_idx_info(info)
    7. ) ENGINE=MyISAM;

    在MySQL5.7及之后版本中可以不指定最后的ENGINE了,因为在此版本中InnoDB支持全文索引。 

    举例2:

    1. CREATE TABLE articles (
    2. id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    3. title VARCHAR (200),
    4. body TEXT,
    5. FULLTEXT index (title, body)
    6. ) ENGINE = INNODB ;

     创建了一个给title和body字段添加全文索引的表。

    1. CREATE TABLE `papers` (
    2. `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    3. `title` varchar(200) DEFAULT NULL,
    4. `content` text,
    5. PRIMARY KEY (`id`),
    6. FULLTEXT KEY `title` (`title`,`content`)
    7. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;

     不同于like方式的的查询:

    SELECT * FROM papers WHERE content LIKE%查询字符串%’;

     全文索引用match+against方式查询:

    SELECT * FROM papers WHERE MATCH(title,content) AGAINST (‘查询字符串’);
    

    注意点 :

            1. 使用全文索引前,搞清楚版本支持情况;

            2. 全文索引比 like + % 快 N 倍,但是可能存在精度问题;

            3. 如果需要全文索引的是大量数据,建议先添加数据,再创建索引。 

    • 创建空间索引

    空间索引创建中,要求空间类型的字段必须为 非空 。

    举例:创建表test5,在空间类型为GEOMETRY的字段上创建空间索引,SQL语句如下:

    1. CREATE TABLE test5(
    2. geo GEOMETRY NOT NULL,
    3. SPATIAL INDEX spa_idx_geo(geo)
    4. ) ENGINE=MyISAM;

    2.在已经存在的表上创建索引

    在已经存在的表中创建索引可以使用ALTER TABLE语句或者CREATE INDEX语句。

    • 使用ALTER TABLE语句创建索引 ALTER TABLE语句创建索引的基本语法如下:
    1. ALTER TABLE table_name ADD [UNIQUE | FULLTEXT | SPATIAL] [INDEX | KEY]
    2. [index_name] (col_name[length],...) [ASC | DESC]
    • 使用CREATE INDEX创建索引 CREATE INDEX语句可以在已经存在的表上添加索引,在MySQL中, CREATE INDEX被映射到一个ALTER TABLE语句上,基本语法结构为:
    1. CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX index_name
    2. ON table_name (col_name[length],...) [ASC | DESC]

     1.3 删除索引

    • 使用ALTER TABLE删除索引 ALTER TABLE删除索引的基本语法格式如下:
    ALTER TABLE table_name DROP INDEX index_name;
    •  使用DROP INDEX语句删除索引 DROP INDEX删除索引的基本语法格式如下:
    DROP INDEX index_name ON table_name;

     提示 删除表中的列时,如果要删除的列为索引的组成部分,则该列也会从索引中删除。如果组成 索引的所有列都被删除,则整个索引将被删除。

     

  • 相关阅读:
    如何提高加速运行Mac电脑系统缓慢的5种方法教程
    数据库系统原理与应用教程(007)—— 数据库相关概念
    3DMAX森林树木植物插Forest Pack Pro 预设库安装教程
    2024.6.15 英语六级 经验与复盘
    2024滴滴校招面试真题汇总及其讲解(四)
    Java List 集合取 交集、并集、差集、补集 Java集合取交集、Java集合并集
    Redis(一):redis基本数据类型与底层存储结构
    面试题------Spring中Bean的初始化以及销毁init-method、destory-method
    带你了解NLP的词嵌入
    中断操作:AbortController学习笔记
  • 原文地址:https://blog.csdn.net/weixin_45969711/article/details/127656575