听说Mysql你很豪横?-------------深入解析mysql数据库中的索引!
时间:2022-07-24
本文章向大家介绍听说Mysql你很豪横?-------------深入解析mysql数据库中的索引!,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一、什么是索引(index)?
- 数据库中的索引与书籍中的目录类似 在一本书中,无须阅读整本书,利用目录就可以快速査找所需信息 书中的目录是一个词语列表,其中注明了包含各个词的页码
- 数据库索引 在数据库中,索引使数据库程序无须对整个表进行扫描,就可以在其中找到所需数据 数据库中的索引是某个表中一列或者若干列值的集合,以及物理标识这些值的数据页的逻辑指针清单
二、索引有什么作用?
- 设置了合适的索引之后,数据库利用各种快速的定位技术,能够大大加快查询速率 特别是当表很大时,或者查询涉及到多个表时,使用索引可使查询加快成干倍
- 可以降低数据库的IO成本,并且索引还可以降低数据库的排序成本(I相当于int存入insert,O相当于out输出select)
- 通过创建唯一性索引保证数据表数据的唯一性 ,可以加快表与表之间的连接 在使用分组和排序时,可大大减少分组和排序时间
三、索引的优缺点是什么?
- 优点 可以快速的找到所需要的的资源
- 缺点 占用空间 所以,相比来说小的数据库就无须建立索引,数据量超过300行的表应该有索引
四、索引的分类
- 普通索引 这是最基本的索引类型,而且它没有唯一性之类的限制
- 唯一性索引 这种索引和前面的“普通索引”基本相同,但有一个区别:索引列的所有值都只能出现一次,即必须唯一 可以为空必须为1 只能空一次
- 主键 主键是一种唯一性索引,但它必须指定为“ PRIMARY KEY 非空且唯一
- 全文索引 MySQL从32323版开始支持全文索引和全文检索。在 MySQL中全文索引的索引类型为 FULLTEXT,全文索引可以在 ARCHAR或者TEXT类型的列上创建
- 单列索引与多列索引 索引可以是单列上创建的索引,也可以是在多列上创建的索引
- 主键key描述字段含义
PRI主键约束;
UNI唯一约束;
MUL可以重复。
五、创建索引有什么原则依据?
- 表的主键、外键必须有索引
- 数据量超过300行的表应该有索引
- 经常与其他表进行连接的表,在连接字段上应该建立索引
- 唯一性太差的字段不适合建立索引
- 更新太频繁地字段不适合创建索引
- 经常出现在 Where子句中的字段,特别是大表的字段,应该建立索引
- 索引应该建在选择性高的字段上
- 索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引
六、什么是外键?什么是候选键?
主表中的外键是另一张表的主键。 候选键:除了主键以外的都是候选键。 要想能快速查找某一条你想要的数据,必须要要创建主键(一般在开始创建表的时候就会设置)。
七、如何创建索引?
根据企业需求选择了合适的索引之后,可使用 create index创建索引
create index加上各个索引关键字便可创建各个类型的索引
1、创建普通索引
mysql> create index ttt on gousheng(name); '创建名为ttt的索引'
mysql> show index from gousheng G;
*************************** 5. row ***************************
Table: gousheng
Non_unique: 1
Key_name: ttt
Seq_in_index: 1
Column_name: name
Collation: A
Cardinality: 4
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
5 rows in set (0.00 sec)
ERROR:
No query specified
mysql> describe gousheng; ' 查看表组成架构'
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id | char(3) | NO | PRI | NULL | |
| name | char(10) | NO | MUL | NULL | |
| score | int(3) | YES | | NULL | |
| address | varchar(50) | YES | | baomi | |
+---------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
2、创建唯一性索引
这里的唯一性 不是指一个字段只能建立一个索引 而是每一字段对应的必须是唯一的 可查找的 跟身份证一样的 唯一索引可以为空 且可以多个NULL空
mysql> create unique index hi on hello(name);
mysql> show index from helloG;
*************************** 1. row ***************************
Table: hello
Non_unique: 0
Key_name: hi
Seq_in_index: 1
Column_name: name
Collation: A
Cardinality: 4
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
1 row in set (0.00 sec)
ERROR:
No query specified
3、创建主键索引
主键索引相当于unique+not null +自动增长auto_ increment primary 在一个表只能出现一次
复合主键 就是说单独的一个字段可以相同 但两个加一起不能相同 两个共同作为主键
表school.service
host_ ip 主机IP
service_ name 服务名
port 服务对应的端口
allow(Y,N) 服务是否允许访问
主键: host_ jip + port = primary key
mysql> create table service(
-> host ip varchar(15) not null,
-> service_ name varchar(10) not null,
-> port varchar(5) not null,
-> allow enum(Y,'N) default 'N',
-> primary key(host_ ip,port)
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> alter table hello add primary key(id);
mysql> show index from helloG;
*************************** 1. row ***************************
Table: hello
Non_unique: 0
Key_name: PRIMARY
Seq_in_index: 1
Column_name: score
Collation: A
Cardinality: 4
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
4、创建全文索引
概念 通过数值比较、范围过滤等就可以完成绝大多数我们需要的查询,但是,如果希望通过关键字的匹配来进行查询过滤,那么就需要基于相似度的查询,而不是原来的精确数值比较。全文索引就是为这种场景设计的。
你可能会说,用 like + % 就可以实现模糊匹配了,为什么还要全文索引?like + % 在文本比较少时是合适的,但是对于大量的文本数据检索,是不可想象的。全文索引在大量的数据面前,能比 like + % 快 N 倍,速度不是一个数量级,但是全文索引可能存在精度问题。
语法:
create fulltext index <索引的名字> on tablename(列的列表);
例如:
create fulltext index full_index_addr on IT_salary(addr);
'//全文索引:往往用于字符串,而不适用于数值类型'
5、查看索引
show index from tablenameG; 竖着去查看
show keys from tablename; 默认横着去查看
6、删除索引
MySQL [company]> drop index namel on department2; 删除名为namel的索引
- Flash/Flex学习笔记(8):ActionScript3.0中的面对对象
- Docker网络解决方案-Weave部署记录
- Flash/Flex学习笔记(7):FMS3.5基于IIS的安装
- Netdata---Linux系统性能实时监控平台部署记录
- linux下向一个文件中的某行插入数据的做法
- Flash/Flex学习笔记(2):捕获摄像头
- split-brain 脑裂问题(Keepalived)
- Android新手之旅(3) 信息的输出
- Nginx code 状态码说明
- Flash/Flex学习笔记(6):制作基于xml数据源的flv视频播放器
- proxy_pass根据path路径转发时的"/"问题记录
- 温故而知新:查看端口占用情况以及DOS中的管道操作/重定向操作
- Android新手之旅(7) RadioButton的自定义
- Flash/Flex学习笔记(4):如何打开网页及Get/Post数据
- MySQL 教程
- MySQL 安装
- MySQL 管理与配置
- MySQL PHP 语法
- MySQL 连接
- MySQL 创建数据库
- MySQL 删除数据库
- MySQL 选择数据库
- MySQL 数据类型
- MySQL 创建数据表
- MySQL 删除数据表
- MySQL 插入数据
- MySQL 查询数据
- MySQL where 子句
- MySQL UPDATE 查询
- MySQL DELETE 语句
- MySQL LIKE 子句
- mysql order by
- Mysql Join的使用
- MySQL NULL 值处理
- MySQL 正则表达式
- MySQL 事务
- MySQL ALTER命令
- MySQL 索引
- MySQL 临时表
- MySQL 复制表
- 查看MySQL 元数据
- MySQL 序列 AUTO_INCREMENT
- MySQL 处理重复数据
- MySQL 及 SQL 注入
- MySQL 导出数据
- MySQL 导入数据
- MYSQL 函数大全
- MySQL Group By 实例讲解
- MySQL Max()函数实例讲解
- mysql count函数实例
- MYSQL UNION和UNION ALL实例
- MySQL IN 用法
- MySQL between and 实例讲解
- Python多任务-协程
- Scrapyd发布爬虫的工具
- MySQL8.0.18 试用Hash Join
- InnoDB:表空间管理
- MyBatis 增删改查
- python分析wav文件
- CICD实战——服务自动构建与部署
- python+opencv实时视频目标检测
- python数据化运营分析实例---销售预测
- Leetcode 1444. 切披萨的方案数(DP,类似石材切割,二维前缀和)
- Python生成内涵图片
- Linux 下makefile实战 ——编写真实的C项目
- MySQL8功能详解——Common table expression (CTE)
- 游戏数据分析
- MySQL8功能详解——隐藏索引