🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

3回答

2543閲覧

Python Mysqlからデータ抽出を高速化する方法

eg_

総合スコア5

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2019/10/15 07:02

前提・実現したいこと

Mysqlのテーブル(1700万行 40列 4GB程度)をpd.DataFrameに入れる?落とす?読み込ませる?(用語がわかりません。)しているのですが、大体2時間ぐらいかかってしまいます。
なにかいい方法ありませんか?

該当のソースコード

import mysql.connector import pandas.io.sql as psql import pandas as pd con = mysql.connector.connect( host='127.0.0.1',db='DB',user='root',passwd='passwd') sql_select = 'select * from table where id in (select id from DB2) and Date >= 2001-1-1' df_db = psql.read_sql(sql_select,con)

補足情報(FW/ツールのバージョンなど)

使用PC:Macbook pro
CPU:Intel i7
メモリ:16GB DDR4 2400MHz

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

  • 取得する行数を減らす。

1700万件すべて必要ですか?集計したり、where句で絞り込んでください。

  • 列数を減らす

select * from table 〜では無く、必要な列のみを取得するようにしてください。

大体、1700万行も取得しても処理が出来ないのでは無いですか?

投稿2019/10/15 10:08

nandymak

総合スコア799

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

eg_

2019/10/16 04:32

回答ありがとうございます。 とりあえず、全部入れればいいかな?という感じで入れてました そして、 df.query(id = idlist[n])のような形でループさせてidごとにdfを作って (例:単価と単位の修正データ(修正ないなら1修正あった場合修正比率)を元に販売価格の列を作ろうと思ってます)を加工したいと思っています。 全部入れてしまうと大きすぎて動かないので、select文で要らない列を減らし、Idごとに取り込んで、加工してから空のdfに連結させていく形で、新しいテーブルの元のdf作ろうと思います。
guest

0

DataFrameに格納する件数を減らして下さい。

DBにあるデータを1700万行を全部取り込んで何をしようとされているのでしょう?
バッチ的な処理なら、DB側で処理すれば良いでしょうし、表示用途で使用されているなら、select 時にlimmit offsetなどでページングを行うようにする。

投稿2019/10/15 08:32

sazi

総合スコア25327

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

eg_

2019/10/16 04:32

回答ありがとうございます。 とりあえず、全部入れればいいかな?という感じで入れてました そして、 df.query(id = idlist[n])のような形でループさせてidごとにdfを作って (例:単価と単位の修正データ(修正ないなら1修正あった場合修正比率)を元に販売価格の列を作ろうと思ってます)を加工したいと思っています。 全部入れてしまうと大きすぎて動かないので、select文で要らない列を減らし、Idごとに取り込んで、加工してから空のdfに連結させていく形で、新しいテーブルの元のdf作ろうと思います。
sazi

2019/10/16 07:15

delete,update,inserrt文だけで済ませれば、取り込む必要も無いと思います。
guest

0

SQLがダメダメです。

SQL

1where id in (select id from DB2)

この部分で時間かかってます。
分からなければ、explainしてみてください。

これをするくらいなら、(DB2のidにインデックスがあることが前提ですが)

SQL

1where EXISTS( 2 SELECT 'X' 3 FROM DB2 4 WHERE DB2.id = table.id 5 )

の方がまだましです。
DB2のテーブルに何件入っているか分かりませんが、
だいぶ改善すると思いますよ。

投稿2019/10/17 07:27

tomari_perform

総合スコア760

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問