我有表结构MySql v 5.7.11:
myfile << x.first << " " << x.second << "\n";
这个表有超过1亿条记录 我需要从电子邮件字段中获取邮件域并按每个域计数,例如:google.com,yahoo.com等。
我使用查询:
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(32) NOT NULL,
`gender` tinyint(2) NOT NULL,
`email` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
);
但是这个查询需要很长时间才能超过2分钟。我无法改变这张表的结构。如何不使用序列扫描,以及如何加速此查询?
答案 0 :(得分:2)
很遗憾,如果不更改数据结构,则无法加快此查询速度。最直接的解决方案是添加一个generated column来计算动态存储中的域名,并且您的查询将在此字段上运行。
如果你绝对不能在这个表的字段中,你仍然可以将另一个表添加到数据库中,该表将包含users表的id和域名。您将后更新和后插入触发器添加到users表,以计算每个新用户记录或更新的用户记录的电子邮件域名。您最初还必须填写新表。您的查询将在新表上运行得更快。
答案 1 :(得分:1)
在没有修改表格的情况下,似乎没有一种直接的方法来加速查询,因为它无法使用索引。
但是,请考虑一下您的用例。即功能是否足以让您的应用程序单独跟踪这些统计信息?例如,如果您有users_email_stats
表,其中包含domain
列和total
,那么您可以
这个表的优点是它会:
users
显而易见的成本是更新计数器的额外维护。