有多个OR子句会减慢查询速度

时间:2013-10-08 22:41:37

标签: php mysql mysqli prepared-statement where-clause

我有一个转换此字符串的函数

[games]|[nexis core]|[core]|[lemure lemure]|[chrome tower dlc]

进入这个where子句

WHERE 
(
    main.tags LIKE '%[games]%' OR 
    main.tags LIKE '%[nexis core]%' OR 
    main.tags LIKE '%[core]%' OR 
    main.tags LIKE '%[lemure lemure]%' OR 
    main.tags LIKE '%[chrome tower dlc]%'
)
在表格中进行搜索,记录将有一个tags字段,如下所示

[boss]|[lemure lemure]|[astra]|[divine]|[kamidori]|[3rd party]|[razil]|[core]

所以当上面的where子句运行时,它可以搜索tags字段,标签的顺序对搜索没有影响

为什么我将[]中的每个标记包含在内并为其添加LIKE cluse的原因是,如果有人搜索标记party,则可能会[3rd party] [party members] [nunnally's battle party] [battle party reality marble]是完全不同的事情,因为[3rd party]用于描述第三组参与的战斗,该战斗与玩家党或敌方无关,而[battle party reality marble]用于描述能力

我用|分隔每个标记,以便当我从数据库中提取并将每个标记输出到页面时,我可以在PHP中爆炸字符串,类似于此处提出问题时的建议标记< / p>

现在,虽然我可以限制使用者可以在搜索中使用的标签数量,例如此网站如何将问题中使用的标签数量限制为5我想尽可能避免这种情况,{我生成的{1}}子句因其生成方式而具有技术上无限的WHERE

我想知道,如果我在查询中使用了太多OR,那么mysqli中的预备语句是否会减慢

1 个答案:

答案 0 :(得分:6)

性能影响不是因为OR组合,而是因为LIKE '%search',它不能使用索引。

实际上,您的数据库非常规范化 - 因此很难得到您需要的东西,并且它需要的性能超过必要的。