(ids.customer_id = customer.customer_id
と入力するつもりだったと思います customer_ids.customer_idではありません)
ORDER BYがない場合、mysqlはタイプ10(インデックス付き)の最初の10個のIDを取得し、それらの顧客を検索して完了しました。 (結合条件は両方のテーブルで一致する行にのみ適用されるため、ここでのLEFTJOINは実際にはINNERJOINであることに注意してください)
ORDER BY mysqlは、おそらくすべてを取得しています。 type =10の顧客を名で並べ替えて、最初の10を見つけます。
これを高速化するには、customersテーブルを非正規化する(タイプをcustomerレコードにコピーする)か、customer_id, name, type
を保持するマッピングテーブルを作成します。 タプル。いずれの場合も、(type, name)
にインデックスを追加します 。マッピングテーブルを使用する場合は、それを使用して顧客とIDとの3方向結合を実行します。
type =10がかなり一般的である場合は、クエリでcustomersテーブルを名前でウォークし、STRAIGHTJOINを使用してそれぞれのタイプを確認することもできます。複合インデックスほど高速ではありませんが、すべての一致をプルアップするよりも高速になります。
上で提案したように、クエリでEXPLAINを実行して、mysqlが使用しているクエリプランを確認します。