2017-11-04 12 views
0

上の列のMySQLのクエリにメモリを割り当て:は、私はこのクエリを持ってその場

SELECT DISTINCT(po.mark) franquicia, COUNT(po.id) failures, GROUP_CONCAT(po.log_transaction SEPARATOR ';') logs, DATE(po.created) fecha 
FROM pagos_onlines AS po 
INNER JOIN usuarios_tokens AS ut ON po.usuario_token = ut.id 
WHERE status = 'REJECTED' 
AND created > '2017-10-03 11:00:01' 
GROUP BY fecha, franquicia; 

問題はlog_transactionは、テーブル内のBLOB型であり、それはJSONデータを格納するので、フィールド「ログ」はべきであるということですJSONを連結した巨大な文字列になります。私がこのクエリを実行すると、フィールド "logs"にJSONが半分しか現れないので、そのフィールドのメモリが空き領域を使い果たしていると思います。

MySQL SELECTクエリを実行しているときに、特定の列のメモリを即座に割り当てる方法はありますか?

+4

Distinctは関数ではありません – Strawberry

答えて

1

このクエリは、ほぼ確実にGROUP_CONCATでカットされているデータについての警告をスローします。警告を無視するクライアントまたはライブラリを使用している場合は、クエリを実行した直後にクエリSHOW WARNINGS;を実行し、この警告が存在することを確認できます。

この問題を解決するには、システム変数@@GROUP_CONCAT_MAX_LENの値を大きくして、切り捨てなしでより長い結果を得る必要があります。

デフォルト値は1024(バイト数であり、ドキュメントによると文字ではありません)です。このクエリを実行する前に、これをグローバル設定で変更するか、セッションで変更することができます。

0

BLOBやTEXTオブジェクトの最大サイズは、その種類、 によって決定されていますが、実際にクライアントとサーバの間 送信できる最大値は、使用可能なメモリの量と のサイズによって決定されます通信バッファ。 によってメッセージバッファサイズを変更することで、max_allowed_packet変数の値を変更できますが、サーバーとクライアントプログラムの両方で を実行する必要があります。

オプションmax_allowed_pa​​cketの値を変更します。

公式参考文献:https://dev.mysql.com/doc/refman/5.7/en/blob.html

関連する問題