【问题标题】:Just a quick query?只是一个快速查询?
【发布时间】:2014-05-13 20:01:05
【问题描述】:

我有一个搜索设置,我正在尝试优化查询以使用 MySQL ver14.14 5.5.36 x64_64 和 php 版本是 5.2.17。

数据库中的每个表都有几十万个项目,当有 50 多个在线用户时,完成搜索的时间变得难以忍受。

基本上,我使用以下方法遍历数据库中的表:

$result =  mysql_query("show tables",$dbc1); 
while($table = mysql_fetch_array($result)) {
$tablename = $table[0];

然后我会在哪里执行这个查询:

"SELECT * FROM $tablename WHERE FirstName like '$SanitizedFirstName%' and LastName like '$SanitizedLastName%' order by ID asc "

然后我循环并输出结果

while($row = mysql_fetch_array( $resultant2 )) {

这是一个数据库示例和其中的一些表

数据库:人

表:大会

|身份证 |名字 |姓氏 |
| 111111111 |乔 | SkypeMan |
| 111111112 |苏珊 |雅虎 |
| 111111113 |比尔 |谷歌海姆 |
| 111111114 |玛格丽特 |宾格多夫 |
| 111111115 |马克 |奥尔德尔森 |

表:参议院

|身份证 |名字 |姓氏 |
| 111111111 |托德 |样品人 |
| 111111112 |杰森 |数据填充 |
| 111111113 |内夫 | LoremIpsum |
| 111111114 |威廉|点点 |
| 111111115 |丽莎 |逗号 |

任何关于优化的帮助将不胜感激!

【问题讨论】:

  • 请注意,mysql 扩展已被弃用,多年来一直不鼓励使用。您可能想要迁移到 mysqli 或 PDO,另请参阅 stackoverflow.com/questions/12859942/…
  • 将所有不同的表合并为一个,为“senate”、“congress”等添加一个标识符。然后你只需要一个查询而不是几个。
  • 不要使用“SELECT *”。您应该只检索您实际要使用的字段。例如:“选择 ID、名字、姓氏……”
  • 谢谢,我知道它已经贬值了。将所有内容合二为一是不可能的。我正在重写选择语句。谢谢大家的意见!

标签: php mysql database query-optimization


【解决方案1】:

删除LIKE 并在WHERE 子句中尽可能使用=。这可能会解决您的问题。这也将有助于查看您的索引。我想你有 FirstName 和 LastName 索引。

【讨论】:

  • 我将 like 更改为 = ,这并没有太大帮助,而且我正在设置 FirstName 和 LastName 索引。谢谢!
  • 您需要在WHERE 子句的每个字段上建立索引。在查询值的开头使用%(例如,LastName LIKE '%$SanitizedLastName%')会阻止对该条件使用索引。但是,在没有前导 % 的情况下使用它(例如 LastName LIKE '$SanitizedLastName%')可能允许您使用 LIKE 并获得所需的性能。如果可以,最好使用=。告诉我进展如何。
【解决方案2】:

将 LIKES 转换为 '=' 确实有助于提高速度,但只要将百分号仅保留在后面,就可以了。如果它真的运行得很慢,您应该确保在 WHERE 语句中使用的列上添加一个 INDEX。添加索引很简单:

CREATE INDEX index_name
ON table_name (column_name)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-22
    • 2012-01-04
    • 2011-07-30
    • 2016-12-12
    • 2013-09-20
    • 1970-01-01
    • 2022-11-29
    • 2012-07-28
    相关资源
    最近更新 更多