私はうまくいきましたこのクエリを持っています。別の主キー索引に変更すると、このクエリでパフォーマンスが低下するのはなぜですか?
SELECT SUM(amount) FROM company.invoice_line WHERE item_id != shipping
AND item_id != ''
AND invoice_id IN
(SELECT id_invoices FROM company.invoices WHERE customer = 'XX'
AND sales_rep = 'XXX');
目的は、顧客からすべての担当者の売上高を合計することです。 顧客およびの代理人のデータは、invoice
テーブルに関連付けられ、invoice
テーブルに関連するテーブルinvoice line
に関連付けられて格納されます。私が働いているデータのサイズについては
、クエリを約0.015s
を取る私はVARCHARた別のPKでクエリでid_invoices
を変更しましたが、独自のフラグを立てたりするものではないではありません。
理由は手前だったので、私はinvoice
がDBに挿入されるという凶悪な設計をしていましたが、invoice
の自動インクリメントされたPKに外部キーとして使用するよう求めるクエリが直ちに続きます。
BULK INSERTを効果的に使用するには、自動増分された「バニラ」INT PKに依存せずに、実質的にすべての自分のデータに固有の識別子にアクセスする必要がありました。上記のようにして、外来キーなどとして役立つ列を追加することでこれを達成しました。
私の挿入率は今すぐ素晴らしいですが、になりました。になりました。
手前で、バニラの自動インクリメントintをPKとして使用していました。外部キーをVARCHARに切り替えると、パフォーマンスが大幅に低下しますか?
私の次の動きは、int idのものに戻っているようですが、手動でこれらのintインデックスを手動で作成するためにMySQLが自動インクリメントを許可するのではなく、一括挿入を使用できます。クエリの観点からは、それは重要ではありません...それは必要ですか?
ご協力いただければ幸いです。
デーン
各クエリの最適化は、 'EXPLAIN'で始まります。 – zerkms