首页
学习
活动
专区
圈层
工具
发布

mysql upper后还走索引

基础概念

MySQL中的UPPER函数用于将字符串转换为大写。索引是数据库管理系统中用于提高数据检索速度的数据结构。MySQL支持多种类型的索引,包括B-tree索引、哈希索引、全文索引等。

相关优势

使用索引可以显著提高查询速度,特别是在处理大量数据时。索引允许数据库引擎快速定位到表中的特定记录,而无需扫描整个表。

类型

MySQL中的主要索引类型包括:

  1. B-tree索引:最常见的索引类型,适用于范围查询和排序操作。
  2. 哈希索引:适用于等值查询,但不支持范围查询。
  3. 全文索引:用于全文搜索。

应用场景

索引通常用于经常用于查询条件的列,例如主键、外键、频繁用于WHERE子句的列等。

问题分析

当在查询中使用UPPER函数时,MySQL可能无法直接使用索引,因为UPPER函数改变了数据的存储形式。MySQL在执行查询时,通常会尝试将查询条件转换为索引可以使用的形式,但UPPER函数会阻止这种优化。

原因

UPPER函数是非确定性的函数,因为它依赖于输入数据。MySQL的查询优化器通常不会将非确定性函数包含在索引查找中,因为这会使得索引查找变得复杂且效率低下。

解决方法

  1. 避免在查询条件中使用UPPER函数: 如果可能,尽量避免在WHERE子句中使用UPPER函数。例如,如果有一个列name,可以这样查询:
  2. 避免在查询条件中使用UPPER函数: 如果可能,尽量避免在WHERE子句中使用UPPER函数。例如,如果有一个列name,可以这样查询:
  3. 使用覆盖索引: 如果必须使用UPPER函数,可以考虑创建一个包含原始列和其大写形式的复合索引。例如:
  4. 使用覆盖索引: 如果必须使用UPPER函数,可以考虑创建一个包含原始列和其大写形式的复合索引。例如:
  5. 这样,查询可以同时利用nameUPPER(name)两个部分。
  6. 使用触发器或存储过程: 在插入或更新数据时,使用触发器或存储过程将数据的大写形式存储在一个额外的列中,并在该列上创建索引。例如:
  7. 使用触发器或存储过程: 在插入或更新数据时,使用触发器或存储过程将数据的大写形式存储在一个额外的列中,并在该列上创建索引。例如:
  8. 然后在name_upper列上创建索引:
  9. 然后在name_upper列上创建索引:

示例代码

假设我们有一个表users,其中有一个列username,我们希望在查询时使用大写形式:

代码语言:txt
复制
-- 创建表
CREATE TABLE users (
    id INT PRIMARY KEY,
    username VARCHAR(255),
    username_upper VARCHAR(255)
);

-- 创建触发器
DELIMITER $$
CREATE TRIGGER before_insert_username
BEFORE INSERT ON users
FOR EACH ROW
BEGIN
    SET NEW.username_upper = UPPER(NEW.username);
END$$
DELIMITER ;

-- 创建索引
CREATE INDEX idx_username_upper ON users (username_upper);

-- 插入数据
INSERT INTO users (id, username) VALUES (1, 'john_doe');

-- 查询数据
SELECT * FROM users WHERE username_upper = 'JOHN_DOE';

参考链接

通过上述方法,可以在使用UPPER函数的情况下仍然有效地利用索引,提高查询性能。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

mysql中走与不走索引的情况汇集(待全量实验)

说明 在MySQL中,并不是你建立了索引,并且你在SQL中使用到了该列,MySQL就肯定会使用到那些索引的,有一些情况很可能在你不知不觉中,你就“成功的避开了”MySQL的所有索引。...,因为你在索引列email列上使用了函数,MySQL不会使用该列索引 同样的,索引列上使用正则表达式也不会走索引。...将无法使用索引; MySQL索引通常是被用于提高WHERE条件的数据行匹配或者执行联结操作时匹配其它表的数据行的搜索速度。...MySQL也能利用索引来快速地执行ORDER BY和GROUP BY语句的排序和分组操作。 通过索引优化来实现MySQL的ORDER BY语句优化: 1、ORDER BY的索引优化。...如果要对多个字段使用索引,建立复合索引。 2>在ORDER BY操作中,MySQL只有在排序条件不是一个查询条件表达式的情况下才使用索引。

12.1K54

索引失效的情况有哪些?索引何时会失效?(全面总结)

虽然你这列上建了索引,查询条件也是索引列,但最终执行计划没有走它的索引。 下面是引起这种问题的几个关键点。...这时候索引如何定位呢?前匹配的情况下,执行计划会更倾向于选择全表扫描。后匹配可以走INDEX RANGE SCAN。 所以业务设计的时候,尽量考虑到模糊搜索的问题,要更多的使用后置通配符。...upper(name)='SUNYANG'; 这样是不会走索引的,因为索引在建立时会和计算后可能不同,无法定位到索引。...oracle对结果集缓存了,所以第二次执行耗时不走索引,走内存就都一样了。...CBO吗)不可见,MySQL 也有,MySQL 8.0 中的索引可以隐藏了。

2.2K20
  • 索引失效的场景有哪些?索引何时会失效?

    虽然你这列上建了索引,查询条件也是索引列,但最终执行计划没有走它的索引。下面是引起这种问题的几个关键点。...这时候索引如何定位呢?前匹配的情况下,执行计划会更倾向于选择全表扫描。后匹配可以走INDEX RANGE SCAN。 所以业务设计的时候,尽量考虑到模糊搜索的问题,要更多的使用后置通配符。...upper(name)='SUNYANG'; 这样是不会走索引的,因为索引在建立时会和计算后可能不同,无法定位到索引。...深入了解MySQL的索引 普通索引这么建: create index idx_test_id on test(id); 虚拟索引Vistual Index这么建: create index idx_test_id...oracle对结果集缓存了,所以第二次执行耗时不走索引,走内存就都一样了。

    2.1K20

    MySQL函数索引避坑指南:别让函数毁了你的索引!

    明明给字段建了索引,可查询时加个简单的函数(比如DATE(create_time)、UPPER(name)),执行速度瞬间变慢;EXPLAIN一看,key字段显示NULL,索引直接失效,全表扫描找上门。...-03-13'; MySQL执行计划详解:从看不懂到秒懂,一线DBA的实战笔记 其实问题很简单:MySQL默认不会对“函数处理后的索引列”生效,而解决这个问题的关键,就是今天要和大家详细聊的MySQL函数索引...因为函数改变了字段的原始形态,破坏了B+树的有序性,优化器只能放弃索引,走全表扫描。 而函数索引(Functional Index),就是针对“函数处理后的结果”建立的索引。...举个通俗的例子:普通索引是“给苹果贴标签”,函数索引是“把苹果切成块,再给每块贴标签”,查询时直接找切块后的标签,省去了“现场切块”的时间。...坑4:忽略数据量,小表用了反而更慢 如果表的数据量很小(比如不到1000行),MySQL优化器会认为“走全表扫描”比“走索引”更快,即使创建了函数索引,也可能不会使用。

    35510

    技术译文 | 为什么 MySQL 添加一个简单索引后表大小增长远超预期?

    仅保留必要的索引以降低写入性能和磁盘空间开销是一种众所周知的好习惯。MySQL 官方文档中简要提到了这个简单的规则[1] 然而,在某些情况下,添加新索引的开销可能远远超出预期!...314 0 15063 1101 180 12 314 0 15072 1092 180 添加二级索引后...,我们可以看到更多关于新索引与主键对比的细节: mysql > show table status like 't1'\G *************************** 1. row ****...这就是为什么我们可以在 extra info[6] 中看到使用索引,即使索引仅在一列上: mysql > EXPLAIN select * from t1 where b=10\G **********...修改后的表定义如下所示: mysql > show create table t1\G *************************** 1. row **********************

    56320

    【MySQL 8】MySQL 5.7即将停止维护,是时候看看MySQL 8了!

    :https://www.mysql.com/why-mysql/benchmarks/mysql/ 除了高性能之外,MySQL 8还新增了很多功能,我找了几个比较有特点的新特性,在这里总结一下。...「MySQL 8」 对索引也有相应的增强,增加了方便测试的 「隐藏索引」 ,真正的 「降序索引」 ,还增加了 「函数索引」。...以前,可以以相反的顺序扫描索引,但会降低性能。降序索引可以按正序扫描,效率更高。 当最有效的扫描顺序混合了某些列的升序和其他列的降序时,降序索引还使优化器可以使用多列索引。...upper(c1)查询时并没有用到索引优化,而c2字段上有函数索引upper(c2),可以把整个upper(c2)看成是一个索引字段,查询时索引生效了!...「函数索引的实现原理:」 函数索引在MySQL中相当于新增了一个列,这个列会根据函数来进行计算结果,然后使用函数索引的时候就会用这个计算后的列作为索引,其实就是增加了一个虚拟的列,然后根据虚拟的列进行查询

    4.3K10

    MySQL 5.7都即将停只维护了,是时候学习一波MySQL 8了

    …除了高性能之外,MySQL 8还新增了很多功能,我找了几个比较有特点的新特性,在这里总结一下。...MySQL 8 对索引也有相应的增强,增加了方便测试的 隐藏索引 ,真正的 降序索引 ,还增加了 函数索引。...以前,可以以相反的顺序扫描索引,但会降低性能。降序索引可以按正序扫描,效率更高。当最有效的扫描顺序混合了某些列的升序和其他列的降序时,降序索引还使优化器可以使用多列索引。...upper(c2),可以把整个upper(c2)看成是一个索引字段,查询时索引生效了!...函数索引的实现原理:函数索引在MySQL中相当于新增了一个列,这个列会根据函数来进行计算结果,然后使用函数索引的时候就会用这个计算后的列作为索引,其实就是增加了一个虚拟的列,然后根据虚拟的列进行查询,从而达到利用索引的目的

    97950

    索引失效的情况有哪些?索引何时会失效?

    阿里终面:索引失效的情况有哪些?索引何时会失效? 虽然你这列上建了索引,查询条件也是索引列,但最终执行计划没有走它的索引。下面是引起这种问题的几个关键点。...这时候索引如何定位呢?前匹配的情况下,执行计划会更倾向于选择全表扫描。后匹配可以走INDEX RANGE SCAN。 所以业务设计的时候,尽量考虑到模糊搜索的问题,要更多的使用后置通配符。...upper(name)='SUNYANG'; 这样是不会走索引的,因为索引在建立时会和计算后可能不同,无法定位到索引。...oracle对结果集缓存了,所以第二次执行耗时不走索引,走内存就都一样了。...Invisible Index Invisible Index是oracle 11g提供的新功能,对优化器(还接到前面博客里讲到的CBO吗)不可见,我感觉这个功能更主要的是测试用,假如一个表上有那么多索引

    1K20

    索引失效的场景有哪些?索引何时会失效?

    来源:blog.csdn.net/bless2015/article/details/84134361 虽然你这列上建了索引,查询条件也是索引列,但最终执行计划没有走它的索引。...这时候索引如何定位呢?前匹配的情况下,执行计划会更倾向于选择全表扫描。后匹配可以走INDEX RANGE SCAN。 所以业务设计的时候,尽量考虑到模糊搜索的问题,要更多的使用后置通配符。...upper(name)='SUNYANG'; 这样是不会走索引的,因为索引在建立时会和计算后可能不同,无法定位到索引。...oracle对结果集缓存了,所以第二次执行耗时不走索引,走内存就都一样了。...Invisible Index Invisible Index是oracle 11g提供的新功能,对优化器(还接到前面博客里讲到的CBO吗)不可见,我感觉这个功能更主要的是测试用,假如一个表上有那么多索引

    86920

    mysql操作

    mysql操作 关系型数据库 本质上是说这类数据库有多张表,通过关系彼此关联 sys是Mysql自己内部运行用的数据库 shemas 着重号的使用: 区分字段和关键字 例如:NAME本身是关键字,加``...中不区分字符和字符串的概念查询表达式: select 100*9;查询函数: select VERSION() 调用该函数得到它的返回值 逻辑顺序: 先用from找到表 where走筛选 最后select...走查询FROM 指名想要查询的表 select * from some_table:先库后id最后table 和py中的from random import choice 有异曲同工之处调用大小级关系...,lower SELECT UPPER(‘join’); JOIN实例:将姓变大写,将名变小写 SELECT CONCAT(UPPER(last_name),LOWER(first_name)) 姓名...,1,1)),’_’,LOWER(SUBSTR(last_name,2))); instr 用于返回字符的起始索引 SELECT INSTR(‘abcdef’,’def’) AS out_put 如果找不到返回

    1.5K10

    Myrocks基本查询源码

    Myrocks是Percona在MySQL上接入了Rocksdb引擎的产物,接入新引擎的主要修改的地方就是MySQL的handler接口。以下针对常用的几个查询分析Myrocks是如何进行处理的。...当然,这里通过二级索引进行查询并不会走'二级索引->主键->数据'的路子,因为只有两列数据,查询二级索引获取主键的过程中已经获得了全部数据,因此不用再通过主键去查询完整的数据。...理论上这种形式和直接查主键时等价的,之所以会通过二级索引因该与优化器的实现有关。...position_to_correct_key() 2.验证是否使用布隆过滤并设置查询的上下边界ha_rocksdb::check_bloom_and_set_bounds() 3.注意:这里设置的lower_bound或upper_bound...其实是key+1或key-1,所以这两个bound之间差2 4.构建的lower_bound/upper_bound当然是经过编码的 */ |------ha_rocksdb::index_read_map_impl

    2K50

    B+树索引使用(8)排序使用及其注意事项(二十)

    上篇文章我们介绍了匹配列前缀,因为索引排序按字母一个个比较的特性,如果%在前面则不能触发索引,还有范围匹配,范围查询的时候,最左边的列可以触发索引,当前面有精确值的时候,比如name = ‘’,第二个范围也能触发索引...在mysql中,在磁盘或者内存中排序的方法统一称为文件排序(英文名:filesort)。一般和文件沾边的,就会很慢,磁盘和内存的速度比起来,就如同飞机比绿皮火车,甚至磁盘比绿皮火车还慢。...而联合索引排序的时候需要注意: 1)、当order by name,birthday,phone时候,这时候会先按name进行排序,当相同的时候,会按birthday进行排序,还相同就按phone。...但是我们如果按name升序,在按birthday降序: Order by name asc,birthday desc limit 10;这种情况下如果采用索引查找非常复杂,mysql设计者觉得这样还不如文件排序来的快...排序使用复杂表达式 比如order by upper(name) limit 10;使用了upper之后就不是单独的列了,也无法使用搜索引擎。

    38720

    MySQL 8.0 为 Java 开发者提供了许多强大的新特性

    这种查询在传统SQL中很难实现,但使用CTE后变得相对简单。2.窗口函数窗口函数允许您在查询结果集的"窗口"(即一组行)上执行计算。这对于数据分析和生成报告非常有用。...3.函数索引函数索引允许您在表达式或函数调用的结果上创建索引,而不仅仅是在列上。这对于经常需要在计算结果上查询的场景非常有用。...CREATE INDEX idx_upper_last_name ON customers ((UPPER(last_name)));这个索引可以加速类似 WHERE UPPER(last_name)...6.降序索引MySQL 8.0支持降序索引,这在某些查询模式下可以提高性能。...8.Hash Join支持Hash Join是一种新的连接算法,特别适用于大表之间的等值连接,尤其是在没有合适索引的情况下。MySQL会自动选择是否使用Hash Join。SELECT a.*, b.

    55710

    性能为王:SQL标量子查询的优化案例分析

    FROM后对一个分区表的一个子分区执行全分区扫描。 下面来看看这个SQL每次执行消耗的物理读与逻辑读。...下面我们考虑一种极端的条件下,SQL访问的几张表都走全表扫描,并且走HASH连接。...两个值是一样的,说明我们在此条SQL改写后是等价的。 这里用到了”此条”,因为如果在连接列有一些空值的情况下得到的结果可以不一样,大家可以测试一下。...在标量子查询中,当主查询返回一行数据时,所有的标量子查询就要执行一次,如果在连接列有索引时,标量子查询在主表返回的行很少的情况下,对性能影响不大,常常出现在OLTP环境,并且连接列一般都有索引;如果在OLAP...学习与进阶之经验谈 DBA入门之路:关于日常工作的建议 业务架构 电子渠道(网络销售)分析系统、数据治理 IT基础架构 分布式存储解决方案 | zData一体机 | 容灾环境建设 数据架构 Oracle DB2 MySQL

    2K50

    数据库索引,真的越建越好吗?

    回表 二级索引不保存原始数据,通过索引找到主键后需要再查询聚簇索引,才能拿到想要的数据。...若需要针对函数调用还能走索引,只能保存一份函数变换后的值,然后重新针对这个计算列做索引。...数据库基于成本决定是否走索引 查询数据可直接在聚簇索引上进行全表扫描,也可走二级索引扫描后到聚簇索引回表。 MySQL如何确定走哪个方案?...即使SQL本身符合索引使用条件,MySQL也会通过评估各种查询方式的代价,来决定是否走索引,走哪个索引。...尝试通过索引进行SQL性能优化时,请一定通过执行计划或实际的效果来确认索引是否能有效改善性能问题,否则增加了索引不但没解决性能问题,还增加了数据库增删改的负担。

    1.7K50

    数据库索引,真的越建越好吗?

    回表 二级索引不保存原始数据,通过索引找到主键后需要再查询聚簇索引,才能拿到想要的数据。...若需要针对函数调用还能走索引,只能保存一份函数变换后的值,然后重新针对这个计算列做索引。...数据库基于成本决定是否走索引 查询数据可直接在聚簇索引上进行全表扫描,也可走二级索引扫描后到聚簇索引回表。 MySQL如何确定走哪个方案?...即使SQL本身符合索引使用条件,MySQL也会通过评估各种查询方式的代价,来决定是否走索引,走哪个索引。...尝试通过索引进行SQL性能优化时,请一定通过执行计划或实际的效果来确认索引是否能有效改善性能问题,否则增加了索引不但没解决性能问题,还增加了数据库增删改的负担。

    1.9K50

    MySQL常用函数大全:字符串、数学、日期时间处理一招鲜

    以下是一些优化建议: 避免在WHERE子句中滥用函数:例如,WHERE UPPER(name) = 'JOHN'会导致全表扫描,无法使用索引。...例如,在WHERE子句中使用函数(如DATE_FORMAT或UPPER)会导致索引失效,从而拖慢查询速度。...对于MySQL 8.0+版本,可以利用函数索引(Functional Indexes)来优化部分场景,例如对UPPER(name)创建索引,从而提升查询性能。...优先考虑使用数据库内置优化(如索引)或业务层预处理。对于MySQL 8.0+,可以尝试使用生成列(Generated Columns)预计算函数结果并加索引。 Q: 如何避免函数导致的错误结果?...在MySQL 8.0+环境中,还可以利用EXPLAIN ANALYZE工具分析函数执行计划,确保索引有效利用。

    77810
    领券