询问
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很重要吗?如果没有,请将其保留,它将阻止排序通过,您的查询将更快完成.