Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何在大型数据库中优化数据库查询?_Mysql_Database_Query Optimization - Fatal编程技术网

Mysql 如何在大型数据库中优化数据库查询?

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

质疑

查询耗时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(`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`);