mysql - 减少 MySQL 查询时间(目前已运行 24 小时且仍在继续)

标签 mysql sql query-optimization

我有一个包含三个表的数据库,我需要将第一个表与其他两个表交叉引用以创建第四个合并信息表。所有表格都有一个公共(public)字段,即 MSISDN(移动/蜂窝电话号码),长度至少为 10 位。

表 1 - 819,248 行

表 2 - 75,308,813 行

表 3 - 17,701,196 行

当存在匹配的 MSISDN 时,我想返回表 1 中的所有行并附加表 2 和表 3 中的一些字段。 我的查询现已运行超过 24 小时,我无法知道这样的事情需要多长时间。

这种类型的查询可能是一个常规项目——有没有办法显着减少查询时间?

我已使用 MSISDN 和我需要返回的字段对表 2 和表 3 建立了索引。

我的查询是这样的:

create TABLE FinishedData 
select 
   Table1.ADDRESS, table1.POSTAL, table1.MOBILE, 
   table1.FIRST, table1.LAST, table1.MID, table1.CARRIER, 
   table1.TOWN, table1.ID, table2.status as 'status1', 
   table2.CurrentNetworkName as 'currentnetwork1', 
   table2.DateChecked as 'datechecked1', table3.Status as 'status2', 
   table3.CurrentNetworkName 'currentnetwork2', 
   table3.DateChecked as 'datechecked2' 
from 
   table1 left join (table2, table3) 
       on (right(table1.MOBILE, 10) = right(table2.MSISDN, 10) 
       AND right(table1.MOBILE,10) = right(table3.MSISDN,10))

MySQL 运行在 64 位 Windows 机器上,具有 12GB 内存和 8 个逻辑核心 @ 3GHz。运行查询时 MySQLd 仅使用 10% cpu 和 600MB 资源。

感谢任何帮助。

最佳答案

杀死性能问题是使用正确的函数当您使用此函数时,MySQL无法使用索引。

我的建议是:

  1. 使用 reverse 在表 2 和表 3 中创建新字段MSISDN的内容
  2. 用左函数替换右函数的连接。

通过这个小小的改变,MySQL 将可以使用索引来进行连接。

说明步骤:

1)创建新列:

Alter table table2 add column r_MSISDN varchar(200);
update table2 set r_MSISDN = reverse( MSISDN );

Alter table table3 add column r_MSISDN varchar(200);
update table3 set r_MSISDN = reverse( MSISDN );

2)新加入:

...
from 
   table1 left join (table2, table3) 
       on (right(table1.MOBILE, 10) = left(table2.r_MSISDN, 10) 
       AND right(table1.MOBILE,10) = left(table3.r_MSISDN,10))

关于mysql - 减少 MySQL 查询时间(目前已运行 24 小时且仍在继续),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9513716/

相关文章:

mysql - 在mysql中查找所有用户购买的所有单个项目

mysql - MAMP 的 PHPMyAdmin 给我 #2002 mysql 错误

c# - '<' 附近的语法不正确。标签 'xmlns' 已经声明。标签名称在查询批处理或存储过程中必须是唯一的

mysql - 如何在 mySQL 中选择没有 Null 的最后一列

mysql - 优化mysql查询

sql - 需要过滤结果优化查询

php - 使用锁表时事务+回滚

mysql - Openemr 示例数据库

SQL - 如何在一个查询中对不同列进行排序

MYSQL 查询 - 按月获取总计