在查询1上,即使id是索引列,也会执行全表扫描。查询2达到相同的结果,但速度更快。如果运行查询1返回索引列,则它会快速返回,但是如果返回未索引列或整个行,则查询将花费更长的时间。
在查询3中,它运行很快,但是列“代码”是VARCHAR2(10)而不是NUMBER(12),并且以与“ id”相同的方式索引。
为什么查询1不选择应使用索引?是否应该更改某些内容以使索引数字列更快地执行?
[查询1]
select a1.*
from people a1
where a1.id like '119%'
and rownum < 5
Explain Plan
SELECT STATEMENT ALL_ROWS
Cost: 67 Bytes: 2,592 Cardinality: 4
2 COUNT STOPKEY
1 TABLE ACCESS FULL TABLE people
Cost: 67 Bytes: 3,240 Cardinality: 5
[查询2]
select a1.*
from people a1, people a2
where a1.id = a2.id
and a2.id like '119%'
and rownum < 5
Explain Plan
SELECT STATEMENT ALL_ROWS
Cost: 11 Bytes: 2,620 Cardinality: 4
5 COUNT STOPKEY
4 TABLE ACCESS BY INDEX ROWID TABLE people
Cost: 3 Bytes: 648 Cardinality: 1
3 NESTED LOOPS
Cost: 11 Bytes: 2,620 Cardinality: 4
1 INDEX FAST FULL SCAN INDEX people_IDX3
Cost: 2 Bytes: 54,796 Cardinality: 7,828
2 INDEX RANGE SCAN INDEX people_IDX3
Cost: 2 Cardinality: 1
[查询3]
select a1.*
from people a1
where a1.code like '119%'
and rownum < 5
Explain Plan
SELECT STATEMENT ALL_ROWS
Cost: 6 Bytes: 1,296 Cardinality: 2
3 COUNT STOPKEY
2 TABLE ACCESS BY INDEX ROWID TABLE people
Cost: 6 Bytes: 1,296 Cardinality: 2
1 INDEX RANGE SCAN INDEX people_IDX4
Cost: 3 Cardinality: 2
LIKE模式匹配条件希望将字符类型视为左侧和右侧操作数。遇到NUMBER时,会将其隐式转换为char。您的查询1基本上是无声地重写为:
SELECT a1.*
FROM people a1
WHERE TO_CHAR(a1.id) LIKE '119%'
AND ROWNUM < 5
在您的情况下会发生这种情况,这很糟糕,原因有两个:
A1.ID
列索引。要解决此问题,您需要执行以下一项操作:
A1.ID
:CREATE INDEX people_idx5 ON people (TO_CHAR(id));
如果您需要匹配ID列的前3个字符的记录,请创建仅包含这3个字符的NUMBER类型的另一列,并在其上使用plain = 运算符。
创建一个 单独ID_CHAR
的类型列,VARCHAR2
并用填充TO_CHAR(id)
。将其编入索引并ID
在您的WHERE
情况下使用而不是。
当然,如果您选择基于现有ID列创建其他列,则需要使这2个列保持同步,您可以将其作为单个UPDATE进行批量处理,也可以在ON-
UPDATE触发器中进行处理,或者将该列添加到适当的位置代码中的INSERT和UPDATE语句。
问题内容: 如果索引是在类型列而不是类型列上设置(并且查询是在该列上进行的),则查询性能是否存在显着差异? 在我目前的设计中,我有2列: TINYINT(1),已 索引 约会时间 查询是 如果我改为在列上创建索引并运行这样的查询,会不会更慢? 问题答案: 这是一个具有1000万行的MariaDB(10.0.19)基准测试(使用sequence插件): 为了衡量我执行查询后使用和运行的时间。从概要分
问题内容: 我有反引号构建MYSQL查询。例如, 相对于: 我认为我是从Phpmyadmin导出中获得这种做法的,并且据我了解,甚至Rails都会生成这样的查询。 但是如今,我看到这样构建的查询越来越少了,而且代码看起来更加混乱,并且查询中带有反引号。即使有了SQL helper函数,没有它们,事情也会变得更加简单。因此,我正在考虑将它们抛在后面。 我想找出这种做法是否还有其他含义,例如SQL(在
我刚加入弹性搜索公司。而不知道如何在JSON请求中对索引和an类型发出正确的请求?(所以我不想像localhost:9200/myindex/mytype/_search那样在URL中使用索引和类型,而是向localhost:9200/_search发出JSON请求) 我试过这样的东西。但我得到的结果是'AAA'索引而不是'BBB'索引。如何只从bbb索引得到结果或者根本没有结果?
问题内容: 因此,请考虑以下表格: 桌子: id(整数,主键) 11 c2 c3 c4 c5 假设我使用的查询在运行时有所不同(例如,一个网站,其中的复选框表示是否要在特定字段上进行搜索),一些可能的实例是: (使用一些值) 问题: 索引的作用是什么?在几个查询中将如何使用它? 在此表上创建最佳索引是什么? 问题答案: MySQL文档做了解释多列索引是如何工作的一个很好的工作在这里。 通常,当索引
问题内容: 在where语句中,添加不必要的括号是否 会影响SQL性能? 例子: 问题答案: 不,没有任何重要意义。 该查询被解析一次,在此阶段,一些额外的括号可能意味着执行时间略有不同,但是您必须要有很多括号才能进行测量。 一旦查询被解析并开始执行,它的行为将与没有多余括号的行为完全相同。仅保留实际操作。
现在,我要检索一个值: Q1:在[3.3,6.6]范围内-预期返回值:[3.3,5.5,6.6]或[3.3,3.3,5.5,6.6](包括最后一个),如果没有,则为[3.3,5.5]或[3.3,3.3,5.5]。 Q2:在[2.0,4.0]范围内-预期返回值:[3.3]或[3.3,3.3] 对于任何其他多索引维度都是相同的,例如B值: Q3:在范围[111,500]中有重复,作为范围中的数据行数-