使用LIKE?%force使用索引的SQL参数

时间:2017-11-24 13:26:44

标签: sql indexing parameters h2 sql-like

当我使用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可以通过许多子选择。

1 个答案:

答案 0 :(得分:0)

解决方案是在没有参数的查询的执行计划中。我现在使用WORD >= 'foo' AND WORD < 'fop'而不是LIKE 'foo%。所以数据库可以使用索引。