mysql – 如何在大型数据库中优化数据库这个查询?

询问

SELECT id FROM `user_tmp` 
WHERE  `code` = '9s5xs1sy' 
  AND  `go` NOT REGEXP 'http://www.xxxx.example.com/aflam/|http://xx.example.com|http://www.xxxxx..example.com/aflam/|http://www.xxxxxx.example.com/v/|http://www.xxxxxx.example.com/vb/'  
  AND check='done'  
  AND  `dataip` <1319992460
ORDER BY id DESC 
LIMIT 50

MySQL返回:

Showing rows 0 - 29 ( 50 total, Query took 21.3102 sec) [id: 2622270 - 2602288]

查询耗时21.3102秒

如果我删除

AND dataip< 1319992460 MySQL返回

Showing rows 0 - 29 ( 50 total, Query took 0.0859 sec) [id: 3637556 - 3627005]

查询花了0.0859秒

如果没有数据,MySQL返回

MySQL returned an empty result set (i.e. zero rows). ( Query took 21.7332 sec )

查询耗时21.7332秒

解释计划:

  SQL query: Explain SELECT * FROM `user_tmp` WHERE `code` = '93mhco3s5y' AND `too` NOT REGEXP 'http://www.10neen.com/aflam/|http://3ltool.com|http://www.10neen.com/aflam/|http://www.10neen.com/v/|http://www.m1-w3d.com/vb/' and checkopen='2010' and `dataip` <1319992460 ORDER BY id DESC LIMIT 50;
    Rows: 1
    id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra
    1   SIMPLE  user_tmp    index   NULL    PRIMARY     4   NULL    50  Using where

使用的数据库示例

CREATE TABLE IF NOT EXISTS user_tmp ( id int(9) NOT NULL
AUTO_INCREMENT, ip text NOT NULL, dataip bigint(20) NOT NULL,
ref text NOT NULL, click int(20) NOT NULL, code text NOT
NULL, too text NOT NULL, name text NOT NULL, checkopen
text NOT NULL, contry text NOT NULL, vOperation text NOT NULL,
vBrowser text NOT NULL, iconOperation text NOT NULL,
iconBrowser text NOT NULL,

  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=4653425 ;

– 转储表user_tmp的数据

INSERT INTO `user_tmp` (`id`, `ip`, `dataip`, `ref`, `click`, `code`, `too`, `name`, `checkopen`, `contry`, `vOperation`, `vBrowser`, `iconOperation`, `iconBrowser`) VALUES
(1, '54.125.78.84', 1319506641, 'http://xxxx.example.com/vb/showthread.php%D8%AA%D8%AD%D9%85%D9%8A%D9%84-%D8%A7%D8%BA%D9%86%D9%8A%D8%A9-%D8%A7%D9%84%D8%A8%D9%88%D9%85-giovanni-marradi-lovers-rendezvous-3cd-1999-a-155712.html', 0, '4mxxxxx5', 'http://www.xxx.example.com/aflam/', 'xxxxe', '2010', 'US', 'Linux', 'Chrome 12.0.742 ', 'linux.png', 'chrome.png');

我想要正确的方法来进行查询和优化数据库

最佳答案 除主键外,您没有任何索引.您需要在WHERE语句中使用的字段上创建索引.如果只需索引1个字段或多个字段的组合取决于您将针对该表运行的其他SELECT.

请记住,REGEXP根本不能使用索引,LIKE只有在不以通配符开头时才能使用索引(所以LIKE’a%’可以使用索引,但LIKE’%a’不能),大于/小于(< ;>)通常也不使用索引.

所以你留下代码和检查字段.我想很多行都有相同的值进行检查,所以我会用代码字段开始索引.多字段索引只能按照定义的顺序使用…

想象一下为字段代码创建索引,检查.此索引可以在您的查询中使用(其中WHERE子句包含两个字段),也可以在仅包含代码字段的查询中使用,但不能在仅包含检查字段的查询中使用.

ORDER BY id很重要吗?如果没有,请将其保留,它将阻止排序通过,您的查询将更快完成.

点赞