当我使用LIKE(可能是更好的解决方案?)时,如果我只想在foo%这个词之后用通配符搜索,我怎么强制使用索引?有和没有参数绑定,请参阅此示例。我想在参数示例中阻止tableScan。
我将SpringBoot应用程序与H2数据库一起使用。
不带参数的查询:
SELECT *
FROM (SELECT resource_id FROM SEARCH_TABLE_874 WHERE word LIKE 'su%')
GROUP BY resource_id ORDER BY COUNT (*) DESC LIMIT 100
执行计划:
SELECT
_1.RESOURCE_ID
FROM (
SELECT
RESOURCE_ID
FROM PUBLIC.SEARCH_TABLE_874
WHERE WORD LIKE 'su%'
) _1
/* SELECT
RESOURCE_ID
FROM PUBLIC.SEARCH_TABLE_874
/++ PUBLIC.IDX_SEARCH_TABLE_874_WORD: WORD >= 'su'
AND WORD < 'sv'
++/
WHERE WORD LIKE 'su%'
*/
GROUP BY RESOURCE_ID
ORDER BY =COUNT(*) DESC
LIMIT 100`
使用参数查询:
`SELECT * FROM (SELECT resource_id FROM SEARCH_TABLE_874 WHERE word LIKE :param) GROUP BY resource_id ORDER BY COUNT (*) DESC LIMIT 100`
执行计划:
`SELECT
_10.RESOURCE_ID
FROM (
SELECT
RESOURCE_ID
FROM PUBLIC.SEARCH_TABLE_874
WHERE WORD LIKE CONCAT(?1, '%')
) _10
/* SELECT
RESOURCE_ID
FROM PUBLIC.SEARCH_TABLE_874
/++ PUBLIC.SEARCH_TABLE_874.tableScan ++/
WHERE WORD LIKE CONCAT(?1, '%')
*/
GROUP BY RESOURCE_ID
ORDER BY =COUNT(*) DESC
LIMIT 100
查询来自的更多详细信息:
这适用于搜索引擎。
Query通过代码生成一个String作为String,然后执行如下:
Query query = session.createNativeQuery(queryString);
query.setParameter("param", "foo%");
query.getFirstResult()
对于执行计划,我在查询前写了EXPLAIN。结构是因为UNION可以通过许多子选择。
答案 0 :(得分:0)
解决方案是在没有参数的查询的执行计划中。我现在使用WORD >= 'foo' AND WORD < 'fop'
而不是LIKE 'foo%
。所以数据库可以使用索引。