听说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的索引
- Owasp测试4.0手册
- 推荐一款Web渗透测试数据库
- 【提莫】一个域名收集及枚举工具
- chmod: changing permissions of `/usr/local/bin/...
- a windows service with the name MYSQL already e...
- NameError: name 'admin' is not defined(彻底解决方案)
- Error: No module named blog
- ubuntu中的django安装配置与操作
- IOS开发之-搜索栏UISearchController详解
- java归并排序(最精简代码)
- java希尔排序(最精简代码)
- java插入排序(最精简代码)
- java快速排序(最精简代码)
- java选择排序(最精简代码)
- 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 实例讲解
- lldb-入坑指北(1)-给xcode添加批量启用禁用断点功能
- 第八章 指针
- Django入门笔记——第二章、Django安装
- lldb 入坑指北(2)- 15行代码搞定二进制与源码映射
- lldb入坑指北(4)-打印任意函数的汇编代码
- ElasticSearch索引 VS MySQL索引
- Python随机打乱列表中的元素
- Python面试题汇总
- lldb 入坑指北(3) - 打印 c++ 实例的虚函数表
- 一文让你彻底搞懂`__str__`和`__repr__`?
- lldb 入坑指北(1) - 给Xcode批量添加启用&禁用断点功能
- Xcode 中的 Workspace、Project、Target 和 Scheme
- 学习Python一年,这次终于弄懂了浅拷贝和深拷贝
- 为速度而生的构建系统 - Ninja
- Python面试题:字符串连接