Mysql 如何在大型数据库中优化数据库查询?
质疑 查询耗时21.3102秒 如果我删除Mysql 如何在大型数据库中优化数据库查询?,mysql,database,query-optimization,Mysql,Database,Query Optimization,质疑 查询耗时21.3102秒 如果我删除 而dataip您需要添加如下索引: ALTER TABLE `user_tmp` ADD INDEX(`dataip`); ALTER TABLE `user_tmp` ADD UNIQUE(`dataip`); 如果列“dataip”仅包含唯一值,则可以添加如下唯一键: ALTER TABLE `user_tmp` ADD INDEX(`dataip`); ALTER TABLE `user_tmp` ADD UNIQUE(`datai
而dataip您需要添加如下索引:
ALTER TABLE `user_tmp` ADD INDEX(`dataip`);
ALTER TABLE `user_tmp` ADD UNIQUE(`dataip`);
如果列“dataip”仅包含唯一值,则可以添加如下唯一键:
ALTER TABLE `user_tmp` ADD INDEX(`dataip`);
ALTER TABLE `user_tmp` ADD UNIQUE(`dataip`);
请记住,在一个大表上添加索引可能需要很长时间,所以不要在没有测试的情况下在生产服务器上这样做。您需要按照where子句中使用的顺序在字段上创建索引。否则不能使用索引。where子句的索引字段。dataip真的需要是bigint吗?根据mysql,签名范围是-9223372036854775808到9223372036854775807,这是一个64位的数字
您需要为作业选择正确的列类型,并添加正确的索引类型。否则这些查询将花费永远。除了主键之外,您没有任何索引。您需要对WHERE语句中使用的字段建立索引。如果只需要索引一个字段或几个字段的组合,则取决于其他选择,您将针对该表运行 请记住,REGEXP根本不能使用索引,LIKE只能在索引不以通配符开头时使用索引,所以像“a%”可以使用索引,但是像“%a”不能使用索引,大于/小于通常不使用索引 剩下的是代码和检查字段。我假设许多行将具有相同的值进行检查,因此我将以代码字段开始索引。多字段索引只能按定义顺序使用 假设为字段代码创建了索引,请选中。此索引可用于where子句同时包含两个字段的查询,也可用于仅包含代码字段的查询,但不能用于仅包含check字段的查询
按id订购重要吗?如果没有,请忽略它,它将阻止排序传递,您的查询将更快完成。我将假设您使用mysql+1来完成所有相关数据的完整问题。如果您可以创建一些字段,例如ip和code char或varchar类型,那么在这些字段上创建索引,尤其是为显示的查询编码,可能会有所帮助。当然,我对基数做了一个完整的猜测,所以可能没有那么大帮助。为什么checkopen是文本?这个表结构中似乎缺少一些东西。第一次查询时,有check='done',表结构中没有check列,只有checkopen,其中包含数字值year,我猜。从user\u tmp return中选择count*是什么?显示行0-29 4653050总计,查询耗时0.0002秒alter table user\u tmp ADD UNIQUEdataip;1062-密钥“dataip”重复输入“1319506641”确定,您的值不是唯一的;尝试第一个查询-它将创建非唯一索引。让我知道它是否帮助EDI尝试没有工作任何结果代码ALTER TABLE user_tmp ADD INDEXdataip;代码结果是最糟糕的query@10neen-com,如果您使用的查询始终具有“code”、“check”和“dataip”的where条件,则扩展您的索引以包括这三个条件。where的顺序无关紧要-它是简单的逻辑计算a和b与b和a相同。将索引的第一部分设置为具有更好基数且可能单独使用的字段。
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
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=4653425 ;
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');
ALTER TABLE `user_tmp` ADD INDEX(`dataip`);
ALTER TABLE `user_tmp` ADD UNIQUE(`dataip`);