検索
ホームページデータベースmysql チュートリアルSQL优化,百万级2张表关联,从40分钟到3秒的历程_MySQL

bitsCN.com

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

结果:

 

SQL优化,百万级2张表关联,从40分钟到3秒的历程_MySQL

 

从这里可以看到ALL以及key为NULL,就是全表扫描,没有走索引,索引失效了!

 

1 然后我建议建上加上联合索引,试试看效果如何:

 

SQL优化,百万级2张表关联,从40分钟到3秒的历程_MySQL

 

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结果:

 

SQL优化,百万级2张表关联,从40分钟到3秒的历程_MySQL

 

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值。

bitsCN.com
声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
MySQLにユーザーを追加:完全なチュートリアルMySQLにユーザーを追加:完全なチュートリアルMay 12, 2025 am 12:14 AM

MySQLユーザーを追加する方法を習得することは、データベース管理者と開発者にとって重要です。これは、データベースのセキュリティとアクセス制御を保証するためです。 1)CreateUserコマンドを使用して新しいユーザーを作成し、2)付与コマンドを介してアクセス許可を割り当て、3)FlushPrivilegesを使用してアクセス許可を有効にすることを確認します。

MySQL文字列データ型のマスター:Varchar vs. Text vs. CharMySQL文字列データ型のマスター:Varchar vs. Text vs. CharMay 12, 2025 am 12:12 AM

choosecharforfixed-lengthdata、varcharforvariable-lengthdata、andtextforlargetextfields.1)chariseffienceforconsistent-lengthdatalikecodes.2)varcharsuitsvariaible-lengthdatalikenames、balancingflexibilityandperformance.3)Textisidealforforforforforforforforforforforidex

MySQL:文字列データ型とインデックス:ベストプラクティスMySQL:文字列データ型とインデックス:ベストプラクティスMay 12, 2025 am 12:11 AM

MySQLの文字列データ型とインデックスを処理するためのベストプラクティスには、次のものが含まれます。1)固定長のchar、可変長さのvarchar、大規模なテキストのテキストなどの適切な文字列タイプを選択します。 2)インデックス作成に慎重になり、インデックスを避け、一般的なクエリのインデックスを作成します。 3)プレフィックスインデックスとフルテキストインデックスを使用して、長い文字列検索を最適化します。 4)インデックスを定期的に監視および最適化して、インデックスを小さく効率的に保つ。これらの方法により、読み取りと書き込みのパフォーマンスをバランスさせ、データベースの効率を改善できます。

MySQL:リモートでユーザーを追加する方法MySQL:リモートでユーザーを追加する方法May 12, 2025 am 12:10 AM

toaddauserremotelytomysql、フォローステープ:1)connecttomysqlasroot、2)createanewuserwithremoteaccess、3)grantniverayprivileges、and4)flushprivileges.

MySQL文字列データ型の究極のガイド:効率的なデータストレージMySQL文字列データ型の究極のガイド:効率的なデータストレージMay 12, 2025 am 12:05 AM

tostorestringseffiedlyinmysql、choosetherightdatatypebasedonyourneadss:1)usecharforfixed-lengthstringslikecountrycodes.2)usevarforvariable-lengthstringslikenames.3)usetextfor forlong-formtextcontent.4)useblobforborikedalikeimages

mysql blob vs.テキスト:大きなオブジェクトに適したデータ型を選択するmysql blob vs.テキスト:大きなオブジェクトに適したデータ型を選択するMay 11, 2025 am 12:13 AM

MySQLのBLOBおよびテキストデータ型を選択する場合、BLOBはバイナリデータの保存に適しており、テキストはテキストデータの保存に適しています。 1)BLOBは、写真やオーディオなどのバイナリデータに適しています。2)テキストは、記事やコメントなどのテキストデータに適しています。選択するときは、データプロパティとパフォーマンスの最適化を考慮する必要があります。

MySQL:製品にルートユーザーを使用する必要がありますか?MySQL:製品にルートユーザーを使用する必要がありますか?May 11, 2025 am 12:11 AM

いいえ、Youは、usotherootuserinmysqlforyourproduct.instead、createpificusers withlimitedprivilegestoenhancesecurityandperformance:1)createanewuserwithastrongpassword、2)grantonlynlyneversearpermissionStothisuser、3)正規環境筋肉筋周辺の環境

MySQL文字列データ型説明:データに適したタイプを選択するMySQL文字列データ型説明:データに適したタイプを選択するMay 11, 2025 am 12:10 AM

mysqlstringdatatypesshouldbechosenbadedatacharacteristicsandusecases:1)usecharforfixed-lengthstringslikecountrycodes.2)usevarforvariable-lengthstringslikenames.3)usebinaryorvarniaryforbinarydatalikecryptograpograpogrationckeys.4)使用

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール