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

相关推荐
Elastic 中国社区官方博客15 分钟前
使用 Elasticsearch 导航检索增强生成图表
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
小金的学习笔记19 分钟前
RedisTemplate和Redisson的使用和区别
数据库·redis·缓存
新知图书34 分钟前
MySQL用户授权、收回权限与查看权限
数据库·mysql·安全
文城52144 分钟前
Mysql存储过程(学习自用)
数据库·学习·mysql
沉默的煎蛋1 小时前
MyBatis 注解开发详解
java·数据库·mysql·算法·mybatis
呼啦啦啦啦啦啦啦啦1 小时前
【Redis】事务
数据库·redis·缓存
HaoHao_0101 小时前
AWS Serverless Application Repository
服务器·数据库·云计算·aws·云服务器
C语言扫地僧1 小时前
MySQL 事务及MVCC机制详解
数据库·mysql
小镇cxy1 小时前
MySQL事物,MVCC机制
数据库·mysql
书生-w2 小时前
Redis Windows 解压版安装
数据库·windows·redis