mysql——数据库索引与事务

前言

想象一下在一本厚重的、未按任何顺序排列的电话簿中寻找一个特定的人名,你需要逐页翻阅,效率极低。索引,就是数据库领域的"电话簿目录"或"书籍索引"。它的核心目的是极大提升数据的查询(检索)速度,尤其是在处理海量数据时。没有索引,MySQL必须进行"全表扫描",即逐行检查所有数据,这在大型表中是灾难性的性能瓶颈。

索引

什么是索引

在技术上,索引是一种存储在磁盘上的、独立于表数据的数据结构。它就像一张"映射表"或一个"导航指南",其中包含表中一列或多列(索引键)的值,以及这些值对应所在数据行的物理地址指针。通过查询这个有序的、高效的数据结构,MySQL能快速定位到目标数据的位置,而无需扫描整个表。

模版

bash 复制代码
create database info;
use info;
create table yjs1023 (id int(10),name varchar(10),cardid varchar(18),phone 
varchar(11),address varchar(50),remark text);
desc yjs1023;
insert into yjs1023 values (1,'zhangsan','123','111111','nanjing','this is 
vip');
insert into yjs1023 values (4,'lisi','1234','444444','nanjing','this is 
normal');
insert into yjs1023 values (2,'wangwu','12345','222222','benjing','this is 
normal');
insert into yjs1023 values (5,'zhaoliu','123456','555555','nanjing','this is 
vip');
insert into yjs1023 values (3,'qianqi','1234567','333333','shanghai','this is 
vip');
select * from yjs1023;

索引类型

普通索引:针对所有字段,没有特殊的需求/规则

直接创建代码:CREATE INDEX 索引名 ON 表名 (列名[(length)]);

修改表方式创建代码:ALTER TABLE 表名 ADD INDEX 索引名 (列名);

创建表的时候指定索引:CREATE TABLE 表名 ( 字段1 数据类型,字段2 数据类型[,...],INDEX 索引名 (列名));。

show create table test;

唯一索引:针对唯一性的字段,仅允许出现一次空值

直接创建唯一索引:CREATE UNIQUE INDEX 索引名 ON 表名(列名);

修改表方式创建:CREATE TABLE 表名 (字段1 数据类型,字段2 数据类型[,...],UNIQUE 索引名 (列名));

创建表的时候指定:CREATE TABLE 表名 (字段1 数据类型,字段2 数据类型[,...],UNIQUE 索引名 (列名));。

组合索引:组合索引是对多个列组合建立的索引,而不仅仅是对单列建立索引。索引中的列顺序非常重要。

代码:CREATE TABLE 表名 (列名1 数据类型,列名2 数据类型,列名3 数据类型,INDEX 索引名 (列名1,列名2,

列名3));

select * from 表名 where 列名1='...' AND 列名2='...' AND 列名3='...';

全文索引:MySQL为了优化对文本内容搜索的一种机制

直接创建索引代码:CREATE FULLTEXT INDEX 索引名 ON 表名 (列名);

修改表方式创建代码:ALTER TABLE 表名 ADD FULLTEXT 索引名 (列名);

创建表的时候指定索引代码:CREATE TABLE 表名 (字段1 数据类型[,...],FULLTEXT 索引名 (列名));

使用全文索引查询代码:SELECT * FROM 表名 WHERE MATCH(列名) AGAINST('查询内容');。

主键索引:针对唯一性字段、且不可为空,同时一张表只允许包含一个主键索引

创建表的时候指定:CREATE TABLE 表名 ([...],PRIMARY KEY (列名));

修改表方式创建:ALTER TABLE 表名 ADD PRIMARY KEY (列名);。

创建原则

选择性强、查询频繁、数据量适中、小字段优先

创建场景

主键与外键、大表超过300行、频繁查询的字段、连接字段、不适合

不适合创建场景

唯一性很差的字段、更新频繁的字段、大文本字段

查看索引信息

查看表的所有索引信息

SHOW INDEX FROM 表名;

SHOW INDEX FROM 表名\G; -- 纵向显示

等价命令

SHOW KEYS FROM 表名;

SHOW KEYS FROM 表名\G;

删除索引

删除普通索引

DROP INDEX 索引名 ON 表名;

删除主键索引

ALTER TABLE 表名 DROP PRIMARY KEY;

通过修改表删除索引

ALTER TABLE 表名 DROP INDEX 索引名;

优点和缺点

优点:

大幅提升查询速度、减少数据库IO操作、降低排序成本、保证数据唯一性(唯一索引)、加快表间连接速度 也可以多表查询 建立所以 就是为了加快表之间 进行查询 读比写多

缺点:

存储空间占用:索引文件需要额外磁盘空间

MyISAM引擎:索引文件和数据文件分离

InnoDB引擎:表数据文件本身就是索引文件

写入性能影响:

插入、修改、删除数据时,索引也需要更新

索引信息字段说明

事务

什么是事务

事务就像是一个打包好的"操作包",这个包里的所有操作,要么**全部成功**,要么**全部失败**,不会出现只完成一部分的中间状态。

ACID特性

原子性:

操作要么全部完成,要么全部不做不能出现操作成功mysql里面的东西却没有减少的情况中间任何一步失败,所有操作都要回滚(从头开始)。

一致性:

事务前后数据总量保持不变数据库的完整性约束不被破坏数据从一个一致状态转换到另一个一致状态。

隔离性:

并发执行的事务相互隔离每个事务有独立的数据空间 避免脏读、不可重复读、幻读等问题。

持久性:

事务一旦提交,对数据库的改变是永久的即使系统故障也不会丢失通过日志机制保证数据的持久性。

事务的作用:

保证数据一致性和完整性。

控制语句:

START TRANSACTION、COMMIT、ROLLBACK。

应用场景:

金融、电商、需要数据一致性的业务。

相关推荐
一瓢西湖水13 小时前
列式数据库-以clickHouse为例
数据库·clickhouse
Elastic 中国社区官方博客13 小时前
使用 Elastic Cloud Serverless 扩展批量索引
大数据·运维·数据库·elasticsearch·搜索引擎·云原生·serverless
liulanba13 小时前
AI Agent技术完整指南 第一部分:基础理论
数据库·人工智能·oracle
逆天小北鼻14 小时前
Oracle 服务端与客户端的核心区分要点
数据库·oracle
2501_9462429314 小时前
MPV-EASY Player (MPV播放器) v0.41.0.1
数据库·经验分享·云计算·计算机外设·github·电脑·csdn开发云
MySQL实战15 小时前
Redis 7.0 新特性之maxmemory-clients:限制客户端内存总使用量
数据库·redis
VX:Fegn089515 小时前
计算机毕业设计|基于springboot + vue校园社团管理系统(源码+数据库+文档)
前端·数据库·vue.js·spring boot·后端·课程设计
luoluoal16 小时前
基于python的小区监控图像拼接系统(源码+文档)
python·mysql·django·毕业设计·源码
北亚数据恢复16 小时前
虚拟机数据恢复—ESXi虚拟机下SqlServer数据库数据恢复案例
数据库
susu108301891116 小时前
使用navicat创建事件event报错You have an error in your SQL syntax
数据库·sql