mysql几百万的表关联_mysql SQL优化,百万级2张表关联,从40分钟到3秒
mysql SQL优化,百万级2张表关联,从40分钟到3秒
SQL优化,百万级2张表关联,从40分钟到3秒的历程
[sql]
表结构如下:
[sql]
CREATE TABLE `deviceback` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`imei` varchar(100) NOT NULL COMMENT '手机唯一标识',
`mid` varchar(50) DEFAULT NULL,
`mac` varchar(100) DEFAULT NULL,
`APNType` varchar(100) DEFAULT NULL,
`status` int(11) DEFAULT '0',
`ip` varchar(100) DEFAULT NULL,
`sn` varchar(100) DEFAULT NULL COMMENT '系列号',
`oem` varchar(100) DEFAULT NULL COMMENT '厂商',
`product` varchar(100) DEFAULT NULL COMMENT '产品',
`region` varchar(100) DEFAULT NULL COMMENT '区域',
`operator` varchar(100) DEFAULT NULL COMMENT '运营商',
`sim` varchar(100) DEFAULT NULL COMMENT 'sim卡号',
`push_time` timestamp NULL DEFAULT NULL COMMENT '第一次登陆时间',
`origin_version` varchar(100) DEFAULT NULL COMMENT '原始版本',
`province` varchar(100) DEFAULT NULL COMMENT '省份',
`provinceCode` varchar(100) DEFAULT NULL COMMENT '省份code',
`city` varchar(50) DEFAULT NULL COMMENT '城市',
`cityCode` varchar(50) DEFAULT NULL COMMENT '城市code',
`brands` varchar(50) DEFAULT '0',
`version` varchar(100) DEFAULT '0' COMMENT '客户端版本号',
`last_checktime` timestamp NULL DEFAULT NULL COMMENT '最后一次登录时间',
PRIMARY KEY (`id`),
FULLTEXT KEY `NewIndex1` (`imei`),
FULLTEXT KEY `NewIndex2` (`mid`),
FULLTEXT KEY `NewIndex3` (`product`),
FULLTEXT KEY `NewIndex4` (`brands`)
) ENGINE=MyISAM AUTO_INCREMENT=6832460 DEFAULT CHARSET=utf8;
[sql]
CREATE TABLE `20130602_AppLog` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`imei` varchar(100) DEFAULT NULL,
`mid` varchar(50) NOT NULL DEFAULT '',
`status` char(1) NOT NULL DEFAULT '0',
`mac` varchar(100) DEFAULT 'NULL',
`sn` varchar(100) DEFAULT NULL,
`sim` varchar(100) DEFAULT NULL,
`coperator` varchar(100) DEFAULT NULL,
`version` varchar(100) DEFAULT NULL,
`logintime` datetime DEFAULT NULL,
`ip` varchar(20) DEFAULT NULL,
`origin_version` varchar(100) DEFAULT NULL,
`now_version` varchar(100) DEFAULT NULL,
`APNType` varchar(20) DEFAULT NULL,
`oem` varchar(20) DEFAULT NULL,
`product` varchar(100) DEFAULT NULL,
`region` varchar(100) DEFAULT NULL,
`operator` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`),
FULLTEXT KEY `NewIndex1` (`imei`),
FULLTEXT KEY `NewIndex2` (`mid`)
) ENGINE=MyISAM AUTO_INCREMENT=3123866 DEFAULT CHARSET=utf8;
SQL如下:
[sql]
SELECT *
FROM deviceback d,20130602_AppLog g
WHERE d.mid=g.mid
AND d.imei=g.imei
AND d.mac=g.mac
AND d.brands=0
AND g.coperator <> '' limit 20;
explain
结果:
从这里可以看到ALL以及key为NULL,就是全表扫描,没有走索引,索引失效了!
1 然后我建议建上加上联合索引,试试看效果如何:
2 效果还是比较慢的,看来得换种办法了,检查所有关联字段,将为null的数据改成''。还是没有效果。
3 不查*了,直接count(*) 看看结果集大小,结果还是卡住了,短时间内没有出查询结果。
4,到这里我猜测估计是数据的构成问题,那就一个个条件去掉去尝试了。
SELECT *
FROM deviceback d,20130602_AppLog g
WHERE d.mid=g.mid
AND d.imei=g.imei
AND d.mac=g.mac
AND d.brands=0 limit 20;
去掉<> 条件试试看,God,结果是37秒就出来了,好,大概问题找到了,出在<>这条判断语句里面,也就是
AND g.coperator <> '' 这个影响还蛮大的。
那就先在20130602_AppLog 表的coperator字段单独建索引试试看,然后查下 20130602_AppLog里面 g.coperator <> ''的有多少?
结果是比较令人欣慰的,单独查询,一秒不到出来结果了,6W多条纪录。
SELECT COUNT(1)
FROM 20130602_AppLog gg
WHERE gg.coperator <> ''
63987
然后再试试整个sql,看需要多长时间。
先看下explain结果:
SELECT *
FROM deviceback d,20130602_AppLog g
WHERE d.mid=g.mid
AND d.imei=g.imei
AND d.mac=g.mac
AND d.brands=0
AND g.coperator <> '' limit 20;
Great,不到3秒就出来结果了。
5,limit 20是OK了,我还想试试不限制limit的话,要多久可以查询出来结果。
直接执行
SELECT *
FROM deviceback d,20130602_AppLog g
WHERE d.mid=g.mid
AND d.imei=g.imei
AND d.mac=g.mac
AND d.brands=0
AND g.coperator <> '' ;
卡住了,很久都没有出来结果,在想是否是数据的问题?切换下where条件后面的字段顺序试试看。
SELECT d.mid,g.mac,
FROM deviceback d,20130602_AppLog g
WHERE
d.imei=g.imei
AND d.mac=g.mac
AND d.mid=g.mid
AND d.brands=0
AND g.coperator <> '' ;
OK,27秒出来了,AND d.mid=g.mid这个之前在第一条,现在放在后面,原因是手机唯一标示这个字段有空值。
God,最讨厌关键业务字段null值了,给我们的优化工作带来巨大的烦恼。
切记:大家以后千万要记住关键业务字段不能允许录入null值。
mysql几百万的表关联_mysql SQL优化,百万级2张表关联,从40分钟到3秒相关推荐
- mysql第二条减第一条_Mysql SQL优化
SQL优化规则 第一条: 尽量全值匹配,也就是说尽量使用等于 第二条: 最佳左前缀原则 如果是复合索引,要遵守最佳左前缀原则,指的是从最左侧列开始并且不跳过索引中的列 如果是按顺序使用的索引列,且有最 ...
- mysql从一个表查出写入另一个表_sql语句 怎么从一张表中查询数据插入到另一张表中...
展开全部 sql语句从一张表中查询数据插入到另一张表中的方法如下:e68a843231313335323631343130323136353331333365653762 1.select * int ...
- 使用sql如何找出两张表中同一字段的不同值
前言: 正逢五一假期有时间来继续更新几篇有关于sql语句的相关博客.在做后台算法测试的时候可能常常会遇到查看输入表中的某条数据是否成功写入到输出表中了,这时候就需要对比这两张表中的数据了. 想要实现这 ...
- mysql将查询结果写入另一张表_将一张表的查询结果插入到另一张表(转)
将一张表的查询结果插入到另一张表 方法一: 代码 1 select into 和 insert into select 两种表复制语句 2 select * into destTbl from src ...
- mysql between and 包含边界吗_MySQL | SQL语法(一)
点击上方"Python编程小记"未来持续推送学习分享,欢迎关注! 本篇使用的数据库管理工具是Navicat for MySQL,回复公众号[SQL]可获取本篇使用的3个数据源表. ...
- 两个mysql表对比_mysql实用技巧之比较两个表是否有不同数据的方法分析
本文实例讲述了mysql比较两个表是否有不同数据的方法.分享给大家供大家参考,具体如下: 在数据迁移中,我们经常需要比较两个表,以便在一个表中标识另一个表中没有相应记录的记录. 例如,我们有一个新的数 ...
- mysql多字段分库分表基因码_mysql数据库优化方案之分库分表,轻松解决亿级数据问题...
今天介绍下sharding-sphere,主要介绍他的特性,分库分表的技术的详解. (一)下载源码官网地址获取源码https://shardingsphere.apache.org/index_zh. ...
- mysql完全限定表列名_mysql必知必会--联 结 表
联结 SQL最强大的功能之一就是能在数据检索查询的执行中联结(join) 表.联结是利用SQL的 SELECT 能执行的最重要的操作,很好地理解联结 及其语法是学习SQL的一个极为重要的组成部分 外键 ...
- mysql数据库的行级锁有几种_MySQL中的行级锁、表级锁、页级锁
在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足. 在DBMS中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引擎).表级锁(MYISAM ...
- mysql sql优化书籍_MySQL SQL优化的正确姿势
大家好,我是知数堂SQL 优化班老师 网名:骑龟的兔子 已经很久没写文章了 今天分享一篇优化SQL 案例 slow query 里有如下 SQL 看下执行计划如下 从执行计划可以看出C表全表扫描了 那 ...
最新文章
- AtCoder Regular Contest 100 D - Equal Cut 思维 + 前缀和
- 干货:看产品总监,如何做全场景的需求梳理?
- C++ 右值引用 | 左值、右值、move、移动语义、引用限定符
- python安装lap_一个python脚本解决安装mq的依赖问题
- 做中学之教与学工具箱
- linux_iptables 详解
- idea中新建javaWeb项目
- java创建线程池几种方式_Java 创建线程池两种不同方法的比较
- Redis六种底层数据结构
- Java多线程之有序性
- windows无法启动计算机上,windows无法启动解决方法汇总
- SQL 注入的资料,快速查表大全
- 【WCN685X】WCN685X WiFi 6E 6G信道与频宽对应关系
- openjudge 1.6.2 陶陶摘苹果
- 为什么要学习IA/IP/IE?
- stm32f103c8t6+ESP8266利用onenet平台上传数据到云平台,再利用云平台远程下发命令给单片机控制LED灯亮灭
- linux系统用中文怎么说,Linux系统的Linux中文怎么读?
- 【Android基础】四种基本布局
- 通过Zadig给蓝牙适配器安装驱动后,无法恢复的解决办法
- [MBTI]16种风格 – 第三篇