postgresql学习笔记之查询不走索引的情况

查询不走索引的情况:
1、条件字段选择性弱,查出的结果集较大,不走索引;
查询结果集占数据行比例对执行计划的影响没有明确的数据界限,可能的比例界限在2%-3%之间
2、where条件等号两边字段类型不同,不走索引;(pg不受影响)
3、索引字段 is null 不走索引;
4、对于count(*)当索引字段有not null约束时走索引,否则不走索引;
5、like 后面的字符当首位为通配符时不走索引;
6、使用不等于操作符如:<>、!= 等不走索引;
7、索引字段前加了函数或参加了运算不走索引;
8,部分索引但查询条件包括不属于部分索引的数据
9、where条件中有or,且or条件两边字段不是都有索引
如果where条件都没有以上所述,那么考虑优化器分析的统计信息陈旧,需要更新这个表的统计信息或者重建索引
注:本文仅供自己学习,如有侵权,请私信

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果您的PostgreSQL表的主键不使用索引进行查询,可能有以下几个原因: 1. 索引未创建或已损坏:请确保已在主键列上创建了索引,并且该索引正常工作。您可以使用以下命令检查索引是否存在: ``` \d table_name ``` 如果索引未显示,请使用以下命令在主键列上创建索引: ``` CREATE INDEX index_name ON table_name (primary_key_column); ``` 2. 数据不均匀:如果表中的数据分布不均匀,则可能会导致索引不起作用。例如,如果表中有大量重复的值,则索引可能会失效。在这种情况States.size(); i++) { if (dfaStates[i].lr0Items.size() == lr0Items.size()) { bool isSame = true; for (int j = 0; j < lr0Items.size(); j++) { LR0Item item1 = lr0Items[j]; LR0Item item2 = dfaStates[i].lr0Items[j]; if (item1.productionIndex != item2.productionIndex || item1.dot != item2.dot) { isSame = false; break; } } if (isSame) { return i; } } } return -1; } ``` 4. 进行语法分析 在SLR(1)分析中,需要使用栈来保存DFA状态编号和符号。可以使用一个结构体来表示栈: ``` struct StackItem { int stateIndex; // DFA状态编号 char symbol; // 符号 }; ``` 可以使用一个vector来表示栈: ``` vector<StackItem> stack; ``` 在分析过程中,需要读入一个输入字符串,并将其转换为一个字符数组。然后,从栈中取出当前状态,并读入下一个字符,根据ACTION和GOTO分析表中的项进行相应的操作。 - 如果ACTION[s][a]为"shift j",则将j推入栈中,并将输入字符指针后移一位。 - 如果ACTION[s][a]为"reduce A -> α",则从栈中弹出|α|个状态和符号,将A推入栈中,并将GOTO[top()][A]推入栈中。 - 如果ACTION[s][a]为"accept",则分析成功。 - 如果ACTION[s][a]为"error",则分析失败。 可以通过以下代码来实现语法分析的过程: ``` stack.push_back(StackItem{0, '#'}); int i = 0; while (i < strlen(input)) { int s = stack.back().stateIndex; char a = input[i]; if (actionTable[s][(int)a].action == 's') { // Shift int j = actionTable[s][(int)a].nextState; stack.push_back(StackItem{j, a}); i++; } else if (actionTable[s][(int)a].action == 'r') { // Reduce int reduceProductionIndex = actionTable[s][(int)a].nextState; Production production = productions[reduceProductionIndex]; int alphaLength = production.right.length(); vector<StackItem> poppedItems(alphaLength); for (int j = 0; j < alphaLength; j++) { poppedItems[j] = stack.back(); stack.pop_back(); } reverse(poppedItems.begin(), poppedItems.end()); int t = stack.back().stateIndex;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值