MySQL record 07 part

索引

注意,是排序,有序就会加快查找的速度。

优势:

劣势

  1. 索引会单独占用存储空间
  2. 索引虽然可以提高排序和查找的速度,但同时也会降低更新、删除、新增数据的速度,因为MySQL此时既要更改表,也要维护更改表后对索引的调整。

所以,只有当进行查找操作的时候,建议使用索引,其他操作(比如更删改就不要使用索引了。

索引分类:

普通索引:

key就是键
唯一索引:

单列索引:

多列索引:

全文索引:


索引的创建

隐式,自动添加的索引
显式,创建索引

显式创建普通索引

性能分析语句可以查看是否使用了索引,

先看字段 book_name 有索引

EXPLAIN SELECT * FROM book WHERE book_name='some';

结果中看到type是ref表示使用了索引,索引名字为idx_bname 再看字段 info 是没有索引的, EXPLAIN SELECT *

FROM book WHERE info='some';

结果中看到type是all,表示没有使用索引,

显式创建唯一索引

显式创建主键索引

显式创建单列索引

显式创建多列索引

多列索引也叫联合索引,

使用性能分析语句查看是否使用的索引,

创建表语句包含的联合索引为:INDEX mul_bid_bname_info(book_id,book_name,info)

EXPLAIN SELECT * FROM book4 WHERE book_id='some';

上图中可以看到type为ref表示使用了联合索引,

注意,只有当查询的字段是多列索引中定义的首字段的时候,才会使用多列索引,如果查询的字段不是多列索引定义的多个字段中的第一个字段,将不会使用多列索引,举例如下:

EXPLAIN SELECT * FROM book4 WHERE book_name='some';

可以看到,本次性能查询语句中查询的字段不是多列索引显式定义时的首字段(book_id,book_name,info),即使book_name在多列索引定义中,但此时做的查询是不会使用多列索引的。

再举一个例子,

EXPLAIN SELECT * FROM book4 WHERE book_id=1001 AND book_name='some'; 查询字段中指定了2个字段都包含在定义多列索引中,最重要的是其中有定义多列索引中的首字段book_id,所以这条查询语句一定会使用多列索引,

而下面的这个例子

EXPLAIN SELECT * FROM book4 WHERE info='book' AND book_name='some';

infobook_name 虽然都在定义的多列索引里,但它们都不是多列索引的首字段,所以在查询时候还是不会使用多列索引。

创建全文索引

创建索引的另一种方式,给已经存在的表创建索引:



使用create index方式在已创建的表上创建索引:

这是在已经创建好的表上创建索引的另一种方式,

测试索引案例:

建表后,创建数据填充函数mock_data:

在创建函数过程中,如果出现错误提示:

ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you might want to use the less safe log_bin_trust_function_creators variable)

需要设置,

SET GLOBAL log_bin_trust_function_creators=TRUE;

如果数据库没有使用主从复制,那么就可以将参数log_bin_trust_function_creators设置为1。

mysql> set global log_bin_trust_function_creators=1;

这个动态设置的方式会在服务重启后失效,所以我们还必须在my.cnf中设置,加上log_bin_trust_function_creators=1,这样就会永久生效。

expain 可以分析MySQL语句的执行能力(耗时),

SELECT * FROM app_user WHERE name='user99';
EXPLAIN SELECT * FROM app_user WHERE name='user99';

在查询语句最前面加上EXPLAIN ,就可以分析这条查询语句的耗时(执行能力),

删除索引:
DROP INDEX uk_idx_bname ON book6;

alter

september2024the23thMonday

需要用到索引的几种情况:

不需要使用索引的几种情况:

索引失效的几种原因:


september2024the23thMonday

相关推荐
会博通·代码搬运工3 分钟前
疾控档案落地难点:异构业务系统并存,高价值纸质凭证如何回流业务闭环
数据库·档案管理·档案管理系统·智能扫描设备·会博通
数智启示录5 分钟前
Apache Kafka Consumer 扩到 40 个仍不提速:Partition 上限锁死有效并行度 【Kafka合集】
数据库·经验分享·分布式·缓存·面试·kafka·apache
数智启示录12 分钟前
Apache Kafka 幂等 Producer 的边界:Exactly-Once 到了 MySQL 为什么失效 【Kafka合集】
数据库·经验分享·分布式·mysql·面试·kafka·apache
Java小白笔记14 分钟前
Java 实现阿里云 OSS 文件上传链路:普通上传、秒传、分片与断点续传
java·开发语言·数据库·spring·阿里云
—Miss. Z—15 分钟前
计算机三级数据库技术—填空题
数据库·mysql
数智启示录39 分钟前
Apache Kafka 同 Key 仍会乱序:从分区 Offset 到业务可见的四道边界 【Kafka 合集】
大数据·数据库·经验分享·分布式·面试·kafka·apache
烬羽1 小时前
给 Agent 一个检索式记忆:把对话历史存进 Milvus,该记的都记得
javascript·数据库·agent
星云API技术支持1 小时前
企业微信二次开发外部群:群聊数据与联系人信息如何建立关联
数据库·php·企业微信
我不是程序员三三1 小时前
桌面管理软件哪个最好?从一次上线翻车事故,拆解选型评估与配置落地全流程
数据库
落木萧萧8251 小时前
MyBatis 关联查询的四种写法,为什么最后都变回了手写 XML
java·数据库·后端