16|「order by」はどのように働いていますか?
1880 ワード
1 select city,name,age from t where city='杭州'order by name limit 1000;の実行プロセス2 using filesortは3 mysqlをソートしてsort_と呼ばれるブロックを割り当てる必要がありますbufferのメモリは4つのフローをソートするために使用されます:bufferを初期化し、インデックスcityから杭州の最初のプライマリ・キーidを見つけてプライマリ・キー・インデックス全体を取り出し、さらに3つのフィールドの値をbufferに格納して次のプライマリ・キーidを引き続き取る上のステップを繰り返し、bufferのデータをソートしてソート結果の1000行5上の操作を「全フィールド・ソート」と呼びます.名前の通り6 bufferのsizeを超えた場合、ディスク・テンポラリ・ファイルを使用して7をソートする必要があります.テンポラリ・ファイルのソートかどうかを確認する方法
8ファイルの並べ替えは並べ替えの思想9 rowidの並べ替えに用いて、全フィールドの並べ替えを改善して、並べ替えたいnameと主キーidだけを入れて、1行のsizeを減らして、更に多くのデータを入れて10の並べ替えが終わってから主キーidの値で主キーインデックスに戻ってすべてのフィールド11 mysqlのもう一つの設計思想を取り出して、メモリが十分であればメモリを多く利用して、ディスクアクセスを減らす(macのメモリメカニズムと似ているような気がする)12インデックスから取り出す順序が整然としている場合は、一時テーブルを並べ替える必要はありません13 using index==インデックスを上書きする14思考問題を使用して、テーブルにcity_が入っていると仮定します.name(city,name)という連合インデックスは、杭州と蘇州の2つの都市のすべての市民の名前を調べ、名前順に上位100件の記録を表示します.SQLクエリ文がこのように書かれている場合:mysql>select*from t where city in('杭州',"蘇州")order by name limit 100;では、この文を実行するときにソートプロセスがありますか.なぜですか.ビジネス・エンド・コードがあなたが開発し、データベース・エンドでソートする必要のないシナリオを実現する必要がある場合、どのように実現しますか?さらに、ページングの必要性がある場合は、101ページ目を表示します.つまり、文が最後に「limit 1000000 100」に変更される場合、あなたの実現方法は何ですか.
ソートが必要です.インデックスはcityによってセグメント化されているので、業務端で実現すれば、杭州と蘇州をそれぞれ取り、もう一度合併ソート操作をしてそれぞれ100を取り、mergeの後で100を取ります.
/* optimizer_trace, */
SET optimizer_trace='enabled=on';
/* @a Innodb_rows_read */
select VARIABLE_VALUE into @a from performance_schema.session_status where variable_name = 'Innodb_rows_read';
/* */
select city, name,age from t where city=' ' order by name limit 1000;
/* OPTIMIZER_TRACE */
SELECT * FROM `information_schema`.`OPTIMIZER_TRACE`\G
/* @b Innodb_rows_read */
select VARIABLE_VALUE into @b from performance_schema.session_status where variable_name = 'Innodb_rows_read';
/* Innodb_rows_read */
select @b-@a;
number_of_tmp_files
8ファイルの並べ替えは並べ替えの思想9 rowidの並べ替えに用いて、全フィールドの並べ替えを改善して、並べ替えたいnameと主キーidだけを入れて、1行のsizeを減らして、更に多くのデータを入れて10の並べ替えが終わってから主キーidの値で主キーインデックスに戻ってすべてのフィールド11 mysqlのもう一つの設計思想を取り出して、メモリが十分であればメモリを多く利用して、ディスクアクセスを減らす(macのメモリメカニズムと似ているような気がする)12インデックスから取り出す順序が整然としている場合は、一時テーブルを並べ替える必要はありません13 using index==インデックスを上書きする14思考問題を使用して、テーブルにcity_が入っていると仮定します.name(city,name)という連合インデックスは、杭州と蘇州の2つの都市のすべての市民の名前を調べ、名前順に上位100件の記録を表示します.SQLクエリ文がこのように書かれている場合:mysql>select*from t where city in('杭州',"蘇州")order by name limit 100;では、この文を実行するときにソートプロセスがありますか.なぜですか.ビジネス・エンド・コードがあなたが開発し、データベース・エンドでソートする必要のないシナリオを実現する必要がある場合、どのように実現しますか?さらに、ページングの必要性がある場合は、101ページ目を表示します.つまり、文が最後に「limit 1000000 100」に変更される場合、あなたの実現方法は何ですか.
ソートが必要です.インデックスはcityによってセグメント化されているので、業務端で実現すれば、杭州と蘇州をそれぞれ取り、もう一度合併ソート操作をしてそれぞれ100を取り、mergeの後で100を取ります.