MySql SUBSTRING_INDEX如何不使用序列扫描

时间:2016-04-24 21:40:46

标签: mysql sql

我有表结构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分钟。我无法改变这张表的结构。如何不使用序列扫描,以及如何加速此查询?

2 个答案:

答案 0 :(得分:2)

很遗憾,如果不更改数据结构,则无法加快此查询速度。最直接的解决方案是添加一个generated column来计算动态存储中的域名,并且您的查询将在此字段上运行。

如果你绝对不能在这个表的字段中,你仍然可以将另一个表添加到数据库中,该表将包含users表的id和域名。您将后更新和后插入触发器添加到users表,以计算每个新用户记录或更新的用户记录的电子邮件域名。您最初还必须填写新表。您的查询将在新表上运行得更快。

答案 1 :(得分:1)

在没有修改表格的情况下,似乎没有一种直接的方法来加速查询,因为它无法使用索引。

但是,请考虑一下您的用例。即功能是否足以让您的应用程序单独跟踪这些统计信息?例如,如果您有users_email_stats表,其中包含domain列和total,那么您可以

  • 将上述查询中的数据预加载到其中
  • 每次触摸用户电子邮件时(使用数据库触发器或从您的应用程序)更新总计

这个表的优点是它会:

  • 与主要用户表相比相对紧凑
  • 完全是一次性的,因为可以从users
  • 轻松地重建数据
  • 包含您需要的数据,并且查询速度非常快

显而易见的成本是更新计数器的额外维护。