如果我有TEXT个数据类型(最多65,535个字符),取前500个字符会比取整列快吗?有一个Left函数特别适用于这种情况,但我想知道它是提高了性能还是降低了它的级别,因为它毕竟是一个函数.

推荐答案

InnoDB存储引擎必须读取全文内容.函数LEFT()对完整的字符串进行操作.它没有任何方法告诉存储引擎只读取字符串的一部分.

在RDBMS中,函数非常了解存储格式,像LEFT()这样的字符串函数可以通过巧妙的方式进行优化.

但是MySQL有一个独特的插件架构来实现各种各样的存储引擎.存储代码与诸如内置字符串函数之类的存储无关的东西是分开的.因此字符串函数没有机会请求文本列的一部分.

实现MySQL的LEFT()函数的代码如下:https://github.com/mysql/mysql-server/blob/8.0/sql/item_strfunc.cc#L1443-L1461

唯一的优化是它判断字符串的长度.如果字符串已经比请求的子字符串短,则只返回整个字符串.这意味着必须有完整的字符串才能判断长度.

Mysql相关问答推荐

正则表达式转换为MYSQL格式

如何查询一行

根据日期重叠转换表格

从 MySQL 8.0.12 升级到 8.0.32 时出错

SQL: Select TEXT 字段的子字符串比整个值快

MySQL 在第一个匹配行后停止搜索 N 行(不是 LIMIT)

使用来自另一个表 mysql 的值将新行插入到表中

为什么以及如何将 Django filter-by BooleanField 查询转换为 SQL WHERE 或 WHERE NOT 而不是 1/0?

当用它的别名替换 (MAX(s.salary) - MIN(s.salary) 它将不起作用.. 为什么?

MySql中的可见索引和不可见索引是什么

由于长时间操作而断开连接后,我的 sql 查询是否继续执行?

按 SQL 删除分组前的重复项

MySQL中的会话客户端是什么

判断一对记录是否属于多个组ID

MySql - 默认情况下主键是唯一的吗?

不正确的整数(2147483647)被插入到 MySQL 中?

MySQL:切换 int 字段值的简单方法

你能推荐一个免费的 Linux 轻量级 MySQL GUI 吗?

带有 LIKE 运算符的 Select 语句中的 MySQL case

按 COUNT(*) 过滤?