索引与查询使用的 collate 不一致导致无法使用索引
索引与表的collate 不一致的情况下,会导致表上的索引不可用,这时要想使用索引,必须在SQL 语句指定建索引所用的collate。
数据库默认collate :
test=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+--------+----------+-------------+-------------+-------------------
security | system | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
template0 | system | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/system +
| | | | | system=CTc/system
template1 | system | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/system +
| | | | | system=CTc/system
test | system | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
(4 rows)
例子1:使用 collate "C" :表使用collate "C" , 则索引及查询语句默认也使用 collate "C" 这可以使用索引。
test=# create table t1(id text collate "C");
CREATE TABLE
test=# insert into t1 select generate_series(1000001,2000000);
INSERT 0 1000000
test=# create index idx_1 on t1(id); CREATE INDEX
test=#
test=# analyze t1;
ANALYZE
test=# explain analyze select * from t1 where id='12345';
QUERY PLAN
---------------------------------------------------------------------------------------------------------------
Index Only Scan using idx_1 on t1 (cost=0.42..8.44 rows=1 width=8) (actual time=0.033..0.033 rows=0 loops=1)
Index Cond: (id = '12345'::text)
Heap Fetches: 0
Planning Time: 0.214 ms
Execution Time: 0.054 ms
(5 rows)
例子2:表使用 “C” ,索引使用 “POSIX” , 则SQL 默认使用 “C”。要想使用索引,SQL必须加 collate "POSIX";
test=# drop index idx_1;
DROP INDEX
test=#
test=# create index idx_1 on t1(id collate "POSIX");
CREATE INDEX
test=# explain analyze select * from t1 where id='12345';
QUERY PLAN
----------------------------------------------------------------------------------------------------------------
Gather (cost=1000.00..10633.43 rows=1 width=8) (actual time=42.802..42.948 rows=0 loops=1)
Workers Planned: 2
Workers Launched: 2
-> Parallel Seq Scan on t1 (cost=0.00..9633.33 rows=1 width=8) (actual time=34.985..34.987 rows=0 loops=3)
Filter: (id = '12345'::text)
Rows Removed by Filter: 333333
Planning Time: 0.226 ms
Execution Time: 42.973 ms
(8 rows) test=#
test=# explain analyze select * from t1 where id='12345' collate "POSIX";
QUERY PLAN
---------------------------------------------------------------------------------------------------------------
Index Only Scan using idx_1 on t1 (cost=0.42..8.44 rows=1 width=8) (actual time=0.093..0.094 rows=0 loops=1)
Index Cond: (id = '12345'::text COLLATE "POSIX")
Heap Fetches: 0
Planning Time: 0.095 ms
Execution Time: 0.116 ms
(5 rows)
索引与查询使用的 collate 不一致导致无法使用索引的更多相关文章
- MySQL中IN子查询会导致无法使用索引
今天看到一个博客园的一篇关于MySQL的IN子查询优化的案例,一开始感觉有点半信半疑(如果是换做在SQL Server中,这种情况是绝对不可能的,后面会做一个简单的测试.)随后动手按照他说的做了一个表 ...
- MySQL中in子查询会导致无法使用索引问题(转)
MySQL的测试环境 测试表如下 create table test_table2 ( id int auto_increment primary key, pay_id int, pay_time ...
- 索引法则--IS NULL, IS NOT NULL 也无法使用索引
Mysql 系列文章主页 =============== 1 数据准备 1.1 建表 DROP TABLE IF EXISTS staff; CREATE TABLE IF NOT EXISTS st ...
- 二十、oracle通过复合索引优化查询及不走索引的8种情况
1. 理解ROWID ROWID是由Oracle自动加在表中每行最后的一列伪列,既然是伪列,就说明表中并不会物理存储ROWID的值:你可以像使用其它列一样使用它,只是不能对该列的值进行增.删.改操作: ...
- Mysql的索引调优详解:如何去创建索引以及避免索引失效
在正式介绍Mysql调优之前,先补充mysql的两种引擎 mysql逻辑分层 InnoDB:事务优先(适合高并发操作,行锁) MyISAM:性能优先(表锁) 查看使用的引擎: show variabl ...
- Mysql数据库表排序规则不一致导致联表查询,索引不起作用问题
Mysql数据库表排序规则不一致导致联表查询,索引不起作用问题 表更描述: 将mysql数据库中的worktask表添加ishaspic字段. 具体操作:(1)数据库worktask表新添是否有图片字 ...
- 慢sql_查询条件加了函数导致索引失效
问题背景:生产环境查询很慢,通过skywaking全链路监控发现/get请求相关的一个sql为慢sql,慢的原因在于查询字段使用了加解密函数( CONVERT(AES_DECRYPT(UNHEX(` ...
- mysql使用索引优化查询效率
索引的概念 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针.更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度.在没 ...
- SQL Server-聚焦过滤索引提高查询性能(十)
前言 这一节我们还是继续讲讲索引知识,前面我们讲了聚集索引.非聚集索引以及覆盖索引等,在这其中还有一个过滤索引,通过索引过滤我们也能提高查询性能,简短的内容,深入的理解,Always to revie ...
- 教你用plsql建立索引加快查询oracle数据的速度
http://jingyan.baidu.com/article/3f16e003cb9a0f2591c10324.html?qq-pf-to=pcqq.c2c PL/SQL Developer是一个 ...
随机推荐
- 2021-07-21 vue插槽
说明 为什么要有插槽? 是为了方便优雅地在父组件中向子组件传递向子组件传递dom结构. 代码处理 子组件 该子组件的组件名为ChildComponent: <template> <d ...
- 产品分享:Qt数学函数公式学科工具,当前版本v1.0.0
若该文为原创文章,转载请注明原文出处本文章博客地址:https://hpzwl.blog.csdn.net/article/details/121194536红胖子(红模仿)的博文大全:开发技术集合 ...
- 项目实战:Qt多段Y轴折线图框架(双Y轴段折线、支持拽拖、浮动游标显示X值各段Y值、支持大量实时显示下位机数据)
若该文为原创文章,转载请注明原文出处本文章博客地址:https://blog.csdn.net/qq21497936/article/details/111660400长期持续带来更多项目与技术分享, ...
- centos8.x阿里源配置
>>> cd /etc/yum.repo.d >>> mkdir bak >>> mv *.repo bak/ >>> cd b ...
- tox包
官方文档 https://tox.readthedocs.io/en/latest/example/basic.html 官方提供的一个简单的tox.ini/默认环境 [tox] envlist = ...
- 【LeetCode二叉树#03】翻转二叉树的几种方法
翻转二叉树 力扣题目链接(opens new window) 翻转一棵二叉树. 这道题目背后有一个让程序员心酸的故事,听说 Homebrew的作者Max Howell,就是因为没在白板上写出翻转二叉树 ...
- Oracle不走索引的原因
Oracle数据库操作中,为什么有时一个表的某个字段明明有索引,当观察一些语的执行计划确不走索引呢?如何解决呢?本文我们主要就介绍这部分内容,接下来就让我们一起来了解一下 . 不走索引大体有以下几个原 ...
- 【Azure Developer】使用Key Vault的过程中遇见的AAD 认证错误
在使用应用程序访问Key Vault获取密钥信息时,现后遇见了多种认证错误.使用的代码为: String keyVaultUrl = "https://test-xxx.vault.azur ...
- hadoop 3.3.5伪分布式集群部署以及遇到的问题解决
hadoop包下载 https://archive.apache.org/dist/hadoop/common/ 安装好jdk并配置环境变量 下载hadoop压缩包并放至 /data/hadoop目录 ...
- 第143篇:手写vue-router,实现router-view
好家伙, 今天来手写我们的老伙计vue-router, 1.替换router 新开一个项目,并使用我们手写的router 2.大致结构 let Vue; // 保存vue的构造函数 cla ...