函数索引触发的一个有趣的问题

超详细图解!【MySQL进阶篇】存储过程,视图,索引,函数,触发器 超详细图解!【MySQL进阶篇】存储过程,视图,索引,函数,触发器1.1 下载Linux 安装包1.2 安装MySQL1.3 启动 MySQL 服务1.4 登录MySQL2\. 索引2.1 索引概述2.2 索引优势劣势2.3 索引结构2.3.1 BTREE 结构2.3.3 B+TREE 结构2.3.3 MySQL中的B+Tree2.4 索引分类2.5 索引语法2.5.1 创建索引2.5.2 查看索引2.5.3 删除索引2.5.4 ALTER命令2.6 索引设计原则3\. 视图3.1 视图概述3.2 创建或者 阅读详情

函数索引触发的一个有趣的问题

导引

听同事提到一个有意思的事情,说在使用GreatSQL时,在navicat客户端和GreatSQL命令行客户端创建的函数索引不能共用,navicat客户端创建的函数索引,在navicat上执行SQL时可以使用,在GreatSQL命令行执行相同的SQL却用不上,反之,在GreatSQL命令行创建的函数索引,在navicat客户端无法使用,这究竟是怎么回事呢?

问题回放

创建测试表与测试数据

CREATE TABLE t1(id INT PRIMARY KEY AUTO_INCREMENT,c1 INT,c2 VARCHAR(100));

INSERT INTO t1(c1,c2) VALUES(20241209120000,'20241209120000');

查询表结构信息

greatsql> SHOW CREATE TABLE t1\G
*************************** 1. row ***************************
       Table: t1
Create Table: CREATE TABLE `t1` (
  `id` int NOT NULL AUTO_INCREMENT,
  `c1` bigint DEFAULT NULL,
  `c2` varchar(100) COLLATE utf8mb4_0900_bin DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_bin
1 row in set (0.00 sec)

navicat客户端增加c1列的函数索引idx_c1。

greatsql> ALTER TABLE t1 ADD INDEX idx_c1((SUBSTR(c1,1,8)));

navicat客户端执行如下SQL,发现可以使用idx_c1索引。

greatsql> EXPLAIN SELECT * FROM t1 WHERE SUBSTR(c1,1,8)  ='20241209';
+----+-------------+-------+------------+------+---------------+--------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key    | key_len | ref   | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+--------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | t1    | NULL       | ref  | idx_c1        | idx_c1 | 35      | const |    1 |   100.00 | NULL  |
+----+-------------+-------+------------+------+---------------+--------+---------+-------+------+----------+-------+
1 row in set (0.03 sec)

GreatSQL命令行执行此SQL,发现索引idx_c1没有用上。

greatsql> EXPLAIN SELECT * FROM t1 WHERE SUBSTR(c1,1,8)  ='20241209';
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | t1    | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    2 |   100.00 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.00 sec)

设置此索引不可见,在命令行创建索引idx_c1_1。

greatsql> ALTER TABLE t1 ALTER INDEX idx_c1 INVISIBLE;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

greatsql> ALTER TABLE t1 ADD INDEX idx_c1_1 ((SUBSTR(c1,1,8)));
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

navicat执行SQL,发现不可以使用索引idx_c1_1;

greatsql> EXPLAIN SELECT * FROM t1 WHERE SUBSTR(c1,1,8)  ='20241209';
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | t1    | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    2 |   100.00 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
1 row in set (0.26 sec)

GreatSQL命令行执行SQL,发现可以使用索引idx_c1_1;

greatsql> EXPLAIN SELECT * FROM t1 WHERE SUBSTR(c1,1,8)  ='20241209';
+----+-------------+-------+------------+------+---------------+----------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key      | key_len | ref   | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+----------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | t1    | NULL       | ref  | idx_c1_1      | idx_c1_1 | 35      | const |    1 |   100.00 | NULL  |
+----+-------------+-------+------------+------+---------------+----------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)

问题分析

什么情况下会导致索引失效呢?

我们很容易会想到以下几个可能,索引列上施加了函数或表达式计算,索引列上发生隐式转换,索引列跟比较值的character set不一致或collation不一致。

那么哪一种可能会引发上面的问题呢?

不知小伙伴们是否注意到一个细节,例子中t1表的c1列原本为bigint类型,取前8位数字创建函数索引,substr(c1,1,8),substr函数的返回值是varchar类型,上面例子中创建的函数索引其实是对字符数据substr(c1,1,8) 进行排序创建的,既然是varchar类型,就会涉及character set与collation的问题。一般来讲,对列施加字符函数,返回值应该与列的字符集和校验规则一致(本例中的c2列原本为varchar类型,对其增加函数索引,两种客户端都可以使用,读者可自行测试验证),但是问题在于本例中的c1列为bigint类型,不涉及字符集和校验规则。

那么对整型列上施加字符函数substr而创建的函数索引,它的character set和collation是依据什么呢?

针对上面的问题,很容易联想到很可能是因为两种客户端上character set和collation设置不同。

为了验证这个问题,首先查询一下两个客户端的character set与collation

navicat:

greatsql> SHOW VARIABLES LIKE 'character%';
+--------------------------+-----------------------------------+
| Variable_name            | Value                             |
+--------------------------+-----------------------------------+
| character_set_client     | utf8mb4                           |
| character_set_connection | utf8mb4                           |
| character_set_database   | utf8mb4                           |
| character_set_filesystem | binary                            |
| character_set_results    | utf8mb4                           |
| character_set_server     | utf8mb4                           |
| character_set_system     | utf8mb3                           |
| character_sets_dir       | /usr/bin/share/greatsql/charsets/ |
+--------------------------+-----------------------------------+
8 rows in set (0.03 sec)

greatsql> SHOW VARIABLES LIKE '%collation%';
+-------------------------------+--------------------+
| Variable_name                 | Value              |
+-------------------------------+--------------------+
| collation_connection          | utf8mb4_0900_ai_ci |
| collation_database            | utf8mb4_0900_bin   |
| collation_server              | utf8mb4_0900_bin   |
| default_collation_for_utf8mb4 | utf8mb4_0900_ai_ci |
+-------------------------------+--------------------+
4 rows in set (0.03 sec)

GreatSQL命令行:

greatsql> SHOW VARIABLES LIKE 'character%';
+--------------------------+-----------------------------------+
| Variable_name            | Value                             |
+--------------------------+-----------------------------------+
| character_set_client     | utf8mb4                           |
| character_set_connection | utf8mb4                           |
| character_set_database   | utf8mb4                           |
| character_set_filesystem | binary                            |
| character_set_results    | utf8mb4                           |
| character_set_server     | utf8mb4                           |
| character_set_system     | utf8mb3                           |
| character_sets_dir       | /usr/bin/share/greatsql/charsets/ |
+--------------------------+-----------------------------------+
8 rows in set (0.01 sec)

greatsql> SHOW VARIABLES LIKE '%collation%';
+-------------------------------+--------------------+
| Variable_name                 | Value              |
+-------------------------------+--------------------+
| collation_connection          | utf8mb4_0900_bin   |
| collation_database            | utf8mb4_0900_bin   |
| collation_server              | utf8mb4_0900_bin   |
| default_collation_for_utf8mb4 | utf8mb4_0900_ai_ci |
+-------------------------------+--------------------+
4 rows in set (0.00 sec)

对比发现,字符集设置是相同的,只有collation_connection参数存在不同。

那么是否是因为collation_connection的设置影响了函数索引的使用呢?我们继续前面的实验,设置navicat客户端的collation_connection参数 ,保持与命令行相同。

greatsql> SET collation_connection=utf8mb4_0900_bin;
Query OK, 0 rows affected (0.00 sec)

greatsql> EXPLAIN SELECT * FROM t1 WHERE substr(c1,1,8)  ='20241209';
+----+-------------+-------+------------+------+---------------+----------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key      | key_len | ref   | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+----------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | t1    | NULL       | ref  | idx_c1_1      | idx_c1_1 | 35      | const |    1 |   100.00 | NULL  |
+----+-------------+-------+------------+------+---------------+----------+---------+-------+------+----------+-------+
1 row in set (0.03 sec)

发现通过改变navicat客户端collation_connection的设置,可以使用GreatSQL命令行创建的索引idx_c1_1了。这说明这个函数索引的collation跟collation_connection有关。

MySQL手册中对collation_connection参数说明如下:

The collation of the connection character set. collation_connection is important for comparisons of literal strings. For comparisons of strings with column values, collation_connection does not matter because columns have their own collation, which has a higher collation precedence .

此参数对字符串常量的比较影响比较大,而对两个列比较影响不大,因为列有自己的collation规则,本例中恰好是函数索引列跟字符常量的比较。

为什么 navicat客户端的collation_connection跟GreatSQL命令行设置会不同呢?

我们打开general log,看一下navicat在连接数据库时发生了什么?

2024-12-10T09:08:29.460226+08:00           10 Connect   greatsql@172.16.64.235 on  using TCP/IP
2024-12-10T09:08:29.463713+08:00           10 Query     SET NAMES utf8mb4
2024-12-10T09:08:29.468336+08:00           10 Query     SHOW VARIABLES LIKE 'lower_case_%';
2024-12-10T09:08:29.472745+08:00           10 Query     SHOW VARIABLES LIKE 'sql_mode';
2024-12-10T09:08:29.475088+08:00           10 Query     SELECT COUNT(*) AS support_ndb FROM information_schema.ENGINES WHERE Engine = 'ndbcluster'
2024-12-10T09:08:29.490589+08:00           10 Query     SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA

使用navicat打开数据库的连接,从general log可以看到数据库接收到“SET NAMES utf8mb4”。

set names语句的语法如下:

SET NAMES {'charset_name'
    [COLLATE 'collation_name'] | DEFAULT}

此语句会改变三个session级会话参数,character_set_client, character_set_connection, and character_set_results。

未指定COLLATE子句时,会将会话级的[collation_connection]参数设置为指定charset_name的默认的collation。从上面查询数据库的character set和collation相关参数设置时可以看到,参数default_collation_for_utf8mb4的值为utf8mb4_0900_ai_ci,所以字符集utf8mb4的默认collation是utf8mb4_0900_ai_ci。

而数据库在global级设置collation_connection的值为utf8mb4_0900_bin。GreatSQL命令行连接数据库并没有发出set names语句,继承了数据库global级的collation_connection参数设置,这才造成了navicat客户端与GreatSQL命令行客户端的session级collation_connection参数设置不同。

问题解决

1.在navicat客户端上涉及此问题时,使用set names语句修改会话级参数设置,与数据库global参数设置保持一致。

SET names utf8mb4 collate utf8mb4_0900_bin;

然后再创建函数索引,执行相关SQL。

2.从根本上解决,还是table设计要规范,本案例中之所以涉及这个问题,是因为时间数据用整型来存储,查询时又按照字符类型来查询一天的数据,所以要建substr函数索引来查询,兜兜转转的转换,还是挺累的。最好时间数据就用时间类型的字段来存储。即便用整型来存储了时间数据,也不一定非要靠建函数索引来解决此问题。直接在列上建索引,语句条件调整为 c1>=20241209000000 and c1<20241210000000, 这样才具备通用性,虽然数据库提供了建函数索引的功能,但其实通过建函数索引来解决问题实在是下下策,因为函数索引的使用具备局限性,换一种查法,可能就用不上了。

如何通过navicat连接SQL Server数据库 本文介绍如何通过Navicat 连接SQL Server数据库。 阅读详情

相关推荐

KV Cache 详解:新手也能理解的 LLM 推理加速技巧

(Autoregressive)生成的,即每次生成一个 token,然后将其作为输入继续生成下一个 token。:如果序列太长,超过了 KV Cache 的存储限制,就需要丢弃最早的 tokens(类似滑动窗口)。时,每次只会生成一个新 token,然后再把这个 token 作为输入继续生成下一个 token。,只缓存计算过的 K,VK, V,每次只计算新 token 的 K,VK, V,从而提升推理效率。:如果输入的 prompt 发生变化,之前的 KV Cache 不能复用,必须重新计算。

Harry的博客 7359

nacicat mysql 索引_关于mysql客户端软件Navicat for mysql中的索引

MySQL支持全文索引(Full-Text)已经很久了,目前,fulltext是一种只适用于MyISAM表的一个索引类型,而且对定义索引列的数据类型也有限制,只能是以下三种的组合char、varchar、text。fulltext可以在创建表的同时就一起定义好,或者在表创建完成之后,通过语句alter table或createindex来追加索引,总之先后的效果是一样的,但是两者的效率却是存在很大...

weixin_39820226的博客 207

【feature_column处理】- indicator_column(指示列)和embedding_column(嵌入列)

1. 开胃菜 我们先来了解一下tf.feature_column.input_layer def input_layer(features, feature_columns, weight_collections=None, trainable=True, cols_to_vars=None, cols_to_output_tensors=None)

DataAlgo 1487

在统信UOS上二进制安装GreatSQL

GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。 GreatSQL是MySQL的国产分支版本,使用上与MySQL一致。 作者:vatebur 文章来源:GreatSQL社区投稿 UOS二进制安装数据库和其他 Linux 基本一样,网上命令行安装的教程很多。考虑到 UOS 自带图形化界面,为了降低一点安装门槛,本文尽量使用图形化界面安装。 纯命令行安装可以参考:https://greatsql.cn/docs/user-manual/3-quick-start/3-2-qui

GreatSQL2021的博客 1302

西门子S7-1200/1500 PLC编程与应用技巧

西门子S7-1200 PLC是一款紧凑型的控制器,适用于小型到中型的自动化控制任务。紧凑设计:集成了I/O模块,减少了控制柜的空间需求。高性能:高达25µs的扫描时间,能够快速响应。模块化扩展:支持扩展输入输出模块、通信模块和智能模块,满足不同的应用需求。多种编程语言:支持Ladder图(梯形图)、功能块图(FBD)、结构化文本(ST)等多种编程语言。西门子S7-1200与S7-1500 PLC是强大且灵活的工业控制系统,适用于各种自动化应用。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 2673

有源滤波电路设计

目录一、低通滤波器1、同相输入低通滤波器(1)一阶低通滤波电路(2)二阶低通滤波电路(压控电压源;Sallen-Key)2、反相输入低通滤波器(1)一阶低通滤波电路(2)二阶低通滤波电路(无限增益多路反馈)二、高通滤波器1、同相输入高通滤波器(1)一阶高通滤波电路(2)二阶高通滤波电路(压控电压源;Sallen-Key)2、反相输入高通滤波电路(1)二阶高通滤波电路(无限增益多路反馈) 一、低通滤波器 1、同相输入低通滤波器 (1)一阶低通滤波电路 即在一阶无源低通滤波器的基础上,加了一个集成运放。 它的

qq_41873236的博客 3万+

mysql添加索引的方法(Navicat可视化加索引和sql语句加索引)

mysql添加索引的方法(Navicat可视化加索引和sql语句加索引)

h1403635700的博客 3万+

Win10自动更新怎么永久关闭?有效的Win10强制更新关闭方法

之前小编为大家分享过一些Win10彻底关闭Windows Update自动更新的方法,主要是通过一些如设置流量计费或借助一些专门的小工具来实现,但往往会发现,Win10自动更新就像打不死的小强,不管怎么关闭,之后还是会自动更新,让不少小伙伴颇为不爽。今天小编带来了这篇改进型教程,通过全方位设置,彻底关闭Win10自动更新,感兴趣的小伙伴不妨试试吧。 ...

jianai0602的博客 108万+

navicat 为表添加索引

navicat 为表添加索引 分析常用的查询场景,为字段添加索引,增加查询速度。 可以添加单列索引,可以添加联合索引。 右键,设计表中可以查看和添加修改索引! 索引一定要根据常用的查询场景进行添加! 写了sql语句测试了一下,确实使用了索引! 可以通过名称来判断使用了什么索引! 帮与跟,让我感受到了索引的使用方法。 navicat软件还是很不错的!...

weixin_34403693的博客 3953

基于51单片机+SYN6288语音播报

51单片机控制SYN6288语音播报资料SYN6288模块原理图语音合成命令接线如何接线实现原理程序代码main.csyn6288.cuart.cdelay.c基于 51单片机的其他项目基于51单片机+遥控灯基于51单片机+LCD1602显示基于51单片机+红外遥控解码+LCD1602显示基于51单片机+DHT11温湿度+LCD1602显示基于51单片机+DS18B20温度测温器+LCD1602显示尾声 资料 我用的是绿深电子技术的模块,资料也挺齐全的。也有相关例程。 SYN6288模块原理图 语音合成

weixin_47457689的博客 3万+

WPF中使用TreeView封装组合控件TreeView+DataGrid

wpf的功能非常强大,很多控件都是原生的,但是要使用TreeView+DataGrid的组合,就需要我们自己去封装实现。功能如上图所示, 目前基本上把常用的样式都实现了,购买源码后,可以自行修改样式。本文源码效果如下,(搞了好几天,的确有难度,所以源码也收费,便宜,赚点辛苦费)第一种:技术的选择是TreeView(也就是本文的演示)。这2个图都是第三方控件自带的,并且都是收费使用。首先说明一下,实现上面的效果,有3种方法。本文演示的是使用TreeView的实现。第二种:技术的选择是DataGrid。

故里2130 1650

MySQL高级篇——索引、视图、存储过程和函数、触发器的相关概念及操作

1.索引 MySQL官方对索引的定义为:索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护者满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。如下面的示意图所示 : 左边是数据表,一共有两列七条记录,最左边的是数据记录的物理地址(注意逻辑上相邻的记录在磁盘上也并不是一定物理相邻的)。为了加快Col2的查找,可以维护一个右边所示的二叉查找树,每个节点分别包含索引键值和

贝尔摩德苦艾酒 7884

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

(保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示

mysql、sql语句、索引、存储过程

zhangfuping123456789的博客 4415

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

mysql索引、事务、锁、存储过程、存储函数与触发器

上面将MySQL中创建各类索引的多种方式都列出来了,接着再聊聊索引查看、使用与管理的命令。

qq_39142108的博客 2542

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

MySQL的存储函数、MySQL的触发器、MySQL的索引

MySQL 中的全文索引,有两个变量,最小搜索长度和最大搜索长度,对于长度小于最小搜索长度和大于最大搜索长度的词语,都不会被索引。尽量少使用触发器,假设触发器触发每次执行1s,insert table 500条数据,那么就需要触发500次触发器,光是触发器执行的时间就花费了500s,而insert 500条数据一共是1s,那么这个insert的效率就非常低了。全文索引主要用来查找文本中的关键字,而不是直接与索引中的值相比较,它更像是一个搜索引擎,基于相似度的查询,而不是简单的where语句的参数匹配。

m0_75278009的博客 297

MySQL存储过程、函数、视图、触发器、索引和锁的基本知识

MySQL存储过程、函数、视图、触发器、索引和锁的基本知识 更多精彩请访问本文源地址: https://blog.youkuaiyun.com/zixiao217 高山仰止 了解视图的使用 了解存储过程、函数的创建和使用 了解触发器的创建和使用 了解MySQL常见的存储引擎和它们的特点 掌握创建索引的方式 理解MySQL锁机制、死锁的概念 第一章-视图 环境准备 -- 一个放款流水表 CRE...

青山师 3201

数据库对象——触发器、索引

触发器 什么是触发器 触发器的类型 DML触发器 替代触发器 系统触发器 触发器的创建 触发器创建语法 创建DML触发器 触发器中使用谓词 触发器的修改与删除 练习行级触发器 练习要求工资只能增加不能降低 索引 索引的分类 按照索引的存储结构分类 B树索引 位图索引 反向键索引 按照索引值是否唯一分类 唯一索引 非唯一索引 按索引分类 单列索引 组合索引 基于函数的索引 索引语法 实例索引练习 建立

爱是与世界平行 1174

MySql 存储过程,触发器,索引,函数

MySql 存储过程,触发器,索引,函数 一、存储过程 procedore 1、简介:存储过程是数据库中的一个对象,存储在服务端,用来封装多条SQL语句且带有逻辑性,可以实现一个功能,由于他在创建时,就已经对SQL进行了编译,所以执行效率高,而且可以重复调用,类似与我们Java中的方法。 2、语法: delimiter $$ -- 将java里的 ";"这个定界符 换为了 "$$" create procedure show_student() --存储过程的名称 begin

huo_wa的博客 398

游标,句柄,存储函数,触发器,索引

相当于在声明语法哪里指定的表中创建一个游标,从第一行开始,每次查询结束后自动往下接着查询,然后再最后没有数据时就会报错从而结束,类似于指针的使用上方代码块便是取之于法的使用,利用游标自动指向下一行的特点,循环查询,最后会报错。

new_person1的博客 405

存储过程和函数的区别?什么是视图、索引、触发器?视图的作用?索引的种类有哪些?

存储过程和函数的区别 存储过程的限制相对较少,函数限制比较多【不能用临时表,只能用表变量】存储过程实现的功能比较复杂,函数实现的功能针对性更强存储过程一般作为独立的部分来执行,函数可以作为查询语句的一部分来调用【可位于 select 中 from 关键字后面】存储过程可返回参数或结果集【可返回多个】,函数只能返回值或表对象【只能返回一个变量】存储过程的参数可以有in,out,inout三种类型,......

UserGuan的博客 945

mysql 索引触发器_MySQL 索引 视图 触发器 存储过程 函数

1.索引索引相当于图书的目录,可以帮助用户快速的找到需要的内容.数据库利用各种各样的快速定位技术,能够大大提高查询效率。特别是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成千上万倍.索引好处:可以提高查询效率,而且是数据量越大效果越明显.索引缺点:添加数据和删除数据效率低索引类型:1.HASH :hash就是一种(key=>value)形式的键值对,允许多个key对应相同的...

weixin_42160398的博客 266

自己实现mysql “函数索引”

对于带有列的函数计算的SQL,MySQL 是无法使用索引的,MySQL并没有Oracle中的函数索引, 例如: SELECT * FROM table_1 WHERE func_1(col_1) AND  func_2(col_2) = const_2 ORDER BY func_3(col_3); 在Oracle中,我们可以建里组合函数索引: CREATE INDE

kf_panda 5958

索引,触发器,存储过程和存储函数及游标的基本使用和了解

索引,触发器,存储过程和存储函数及游标的基本使用和了解索引口述并理解1. 什么是索引2. 索引的作用有哪些3. 索引的分类有哪些4. 创建索引的原则有哪些动手做1. 如何创建索引2. 如何删除索引触发器1. 什么是触发器2. 如何创建一个触发器存储过程和存储函数1. 什么是存储过程2. 什么是存储函数(自定义函数)3. 存储过程与存储函数的区别4. 如何创建及调用一个存储过程5. 如何常见及调用一个存储函数6. 如何删除存储过程7. 如何删除存储函数游标1. 什么是游标2. 使用游标的四个步骤:1. 声明游

励志当大牛的博客 1056

mysql函数,触发器,存储过程,视图,索引

Mysql 一 : 函数 (一) 字符函数 (二) 数值函数 (三) 日期时间 (四) 流程函数 (五) 其他函数 (六) 自定义函数 语法 简单的函数 返回666 无参函数 返回student表中的数据的行数 有参函数 根据id查询student的name 二 : 触发器 (一) 概述 针对于一类或几类操作(增删改), 同时进行的监听操作 触发器一旦创建, 无需任何操作, 自动运行 (二) 语法 (三) 案例 新增 修改 删除 三 : 存储过程 (一) 概述 可以理解为存储

x871752024的博客 183

MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】

MySQL 进阶使用

功不唐捐,玉汝于成 1829
上一篇: GreatSQL修改配置文件参数无法生效
下一篇: 基于 MySQL 8.0 细粒度授权:单独授予 KILL 权限的优雅解决方案
GreatSQL社区
博客等级 码龄5年 1210粉丝 390原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值