2

我网站的数据库已被托管方阻止...他们说您的查询花费了太多时间来执行...他们发送的消息是:

    This message is to advise you of a temporary block placed on your database. The database "**DATABASE NAME**" was found to be consuming an inordinate amount of processor time, to the point of degrading overall system performance. While we do limit each account to no more than 25% of a system's CPU in our terms of service, we do not actively disable accounts until they greatly exceed that number, which is what happened in this case.

Running Processes:
fastlynx 26884 0.3 0.0 0 0 ? ZN 23:26 0:00 [php] <defunct>

Running Queries:
*************************** 1. row ***************************
USER: USERNAME
DB: SB_NAME
STATE: optimizing
TIME: 40
COMMAND: Query
INFO: SELECT * FROM price WHERE country LIKE '27'/*--*/and/*--*//*!30000if(ascii(substring((user()),11,1))<121,BENCHMARK(151973069.6,MD5(0x41)),0)*//*--*/and/*--*/'x'='x%' GROUP BY country ASC order by country asc limit 0, 12
*************************** 2. row ***************************
USER: USERNAME
DB: DB_NAME
STATE: optimizing
TIME: 54
COMMAND: Query
INFO: SELECT * FROM price WHERE country LIKE '27'/*--*/and/*--*//*!30000if(ascii(substring((user()),4,1))<122,BENCHMARK(151973069.6,MD5(0x41)),0)*//*--*/and/*--*/'x'='x%' GROUP BY country ASC order by country asc limit 0, 12

从上面看来,来自单个表的查询正在花费最大执行时间......我已经通过 mysql 控制面板优化了数据库中的所有表。伙计们..帮我处理这种情况。提前致谢....

编辑 :

实际查询如下:

SELECT * FROM price WHERE country LIKE 'G%' GROUP BY country ASC limit 0, 12
                               OR
SELECT * FROM price WHERE prefix LIKE '91%' GROUP BY country ASC limit 0, 12

还有一件事……我有时也使用 NOT LIKE 像这样:

SELECT * FROM price WHERE country LIKE 'G%' AND country NOT LIKE 'INDIA%' GROUP BY country ASC limit 0, 12

数据库表价格屏幕截图

4

1 回答 1

5

“优化”是什么意思?如果您已经这样做了,我们将无法再为您做任何事情。

但是考虑到你使用WHERE country LIKE '27'你并没有优化那么多。如果国家总是一个整数值,请确保国家有一个数字数据类型并且你在它上面放置了一个索引。也用 查询它WHERE country='27',因为LIKE语句不使用索引但会进行全表扫描。(如果您有 1000 行,则每次执行该查询时,所有这 1000 行都将加载到内存中并进行检查。)

另外,由于您在国家/地区使用GROUP BYand ORDER,因此请确保此列上有正确的索引。

但是由于查询的另一部分是if(ascii(substring((user()),11,1))<121,BENCHMARK(151973069.6,MD5(0x41)),0)您可以忘记快速查询。那条小龙会在一张大桌子上闲逛。

由于我不知道其中哪一部分是动态的,哪一部分是静态的,所以我无法真正提供优化改进。也许给我们一些关于您要完成的任务的见解,以便我们可以帮助定义更好的数据库结构。

更新:

您的查询似乎很奇怪。以最后一个为例。您正在选择以 开头的所有国家/地区G,然后取消以 开头的国家/地区INDIA。上次我检查Iis not a G,所以第二部分没用,只会增加开销。

SELECT * FROM price WHERE country LIKE 'G%' AND country NOT LIKE 'INDIA%'

现在我不知道你的表中有多少个国家,但除非你在另一个星球上添加一些,否则不能超过~200。有了 200 条记录,您几乎可以运行任何查询而不会遇到问题。

我还注意到您GROUP BY在国家/地区使用,这意味着国家/地区多次出现在列表中。但是由于您使用orSELECT *并且没有任何AGGEGRATE FUNCTIONS类似SUMor COUNT,我希望每个国家/地区只有一个记录。

考虑到所有因素,这似乎是一种非常糟糕的设计模式,并且在不知道您想对数据做什么的情况下,我无法为您提供帮助。尝试至少提供以下内容

  • SELECT *考虑到分组,您打算使用哪个领域?

  • 什么是前缀?它是一个数字列还是一些代码?当您使用 时,您期望得到什么回报LIKE '91%'?前缀为“91”和“916”的国家?还是只是'91'?

  • 表格中的国家不止一次吗?

更新 2:

屏幕截图使事情更加清晰。由于您要显示基于国家/地区(实际上是国家/地区+提供者)的所有信息,因此我将进行以下更改:

  • 从此表中删除前缀列,并为前缀创建一个单独的表,其中包含指向该表中 auto_id 字段的链接。
  • 在国家列上添加唯一索引(从而删除所有重复项)。如果不需要前缀,则可以选择不使用 GROUP BY。

  • 如果您经常选择以单个字母开头的所有国家/地区,请添加另一列作为 char(1) 并在添加/更新行时将该国家/地区的第一个字母添加到该列。在该列上放置一个索引,然后您可以选择 using SELECT * FROM price WHERE newcol='G'。如果需要,您仍然可以添加第二部分(不喜欢)。

  • 如果您在国家/地区列上有搜索功能,请考虑使用FULL TEXT INDEX

于 2013-04-29T06:37:47.193 回答