以下はecshopのproductテーブルとbrandテーブルのクエリです。両者のクエリ効率の違いは何ですか?
もう 1 つの質問は、左結合と結合のどちらがより効率的かということです。
ありがとう! !
SELECT a.`goods_id` , a.`goods_name` , b.brand_nameFROM `ecs_goods` AS aLEFT JOIN ecs_brand AS b ON a.`brand_id` = b.`brand_id`
SELECT a.`goods_id` , a.`goods_name` , b.brand_nameFROM `ecs_goods` AS a, ecs_brand AS bWHERE a.`brand_id` = b.`brand_id`
他にフィルター条件がないため、最初の数式は左側のリンクです
結果セットには、左側のテーブル (ecs_goods) のすべてのレコードが含まれます
最初の式 2 番目の式はカンマ接続 (INNER JOIN の略)
接続条件を満たすレコードのみが結果セットに表示されます
両者の機能は異なるため、効率の比較はできません
いつ右側のテーブル (ecs_brand) にはフィルター条件があります
左側 接続は内部結合に縮退し、2 つの式は同じであり、違いはありません
他にフィルター条件がないため、最初の式は左側のリンクです
そこ結果セット内の左側のテーブル (ecs_goods) のすべてのレコードになります
2 番目の式 式はカンマ接続 (INNER JOIN の略) です
接続条件を満たすレコードのみが結果セットに表示されます
両者の機能は異なり、効率の比較はできません
モデレータ 左側を削除するのは最初の SQL ですか? 2 番目の SQL とまったく同じです。
効率とインデックスの使用に関して、両者に違いはありますか?
右側のテーブル (ecs_brand) にフィルター条件がある場合
左側の結合は内部結合に縮退し、2 つの式は同じであるため、違いはありません
モデレーター ご回答ありがとうございます。まだ質問があります
たとえば、製品にブランドが必要な場合、その製品にはブランド ID が必要であることを意味します。
次に、ブランドリストに製品を含める必要があるブランドがあります。
したがって、left join または join によって返される結果は同じです。それでは、効率の観点からそれらを比較できるでしょうか?
接続の外側にフィルター条件があるため、mysql は内部接続へのクエリ命令を最適化します。したがって、効率の比較はありません
もちろん、ここで比較できるのは、
商品テーブルでブランド商品を確認することと、ブランドテーブルで商品を探すことです
両者の効率は異なります
ブランドテーブルは明らかに製品テーブルより小さい
接続の外側にフィルター条件があるため、mysql はクエリ命令を内部接続に最適化します。したがって、効率の比較はありません
もちろん、ここで比較できるのは、
商品テーブルでブランド商品を確認することと、ブランドテーブルで商品を探すことです
両者の効率は異なります
ブランドテーブルは明らかに製品テーブルよりも小さいです
モデレーター ご回答ありがとうございます
あなたの回答を要約しました:
最初のポイント:
SELECT a.`goods_id` , a.`goods_name` , b.brand_nameFROM `ecs_goods` AS a, ecs_brand AS bWHERE a.`brand_id` = b.`brand_id`
SELECT a.`goods_id` , a.`goods_name` , b.brand_nameFROM `ecs_goods` AS aJOIN ecs_brand AS b ON a.`brand_id` = b.`brand_id`
SELECT a.`goods_id` , a.`goods_name` , b.brand_nameFROM `ecs_goods` AS aJOIN ecs_brand AS b ON a.`brand_id` = b.`brand_id`
SELECT a.`goods_id` , a.`goods_name` , b.brand_nameFROM ecs_brand AS bJOIN `ecs_goods` AS a ON b.`brand_id`=a.`brand_id`
笑、自分でコンセプトを変えて、自分にコツを与えてください!
SELECT a.`goods_id` , a.`goods_name` , b.brand_nameFROM `ecs_goods` AS a, ecs_brand AS bWHERE a.`brand_id` = b.`brand_id`
SELECT a.`goods_id` , a.`goods_name` , b.brand_nameFROM `ecs_goods` AS a INNER JOIN ecs_brand AS b ON a.`brand_id` = b.`brand_id`
SELECT a.`goods_id` , a.`goods_name` , b.brand_nameFROM `ecs_goods` AS a LEFT JOIN ecs_brand AS b ON a.`brand_id` = b.`brand_id`WHERE b.`field_name`= 123
SELECT a.`goods_id` , a.`goods_name` , b.brand_nameFROM `ecs_goods` AS a, ecs_brand AS bWHERE a.`brand_id` = b.`brand_id`AND b.`field_name`= 123
に最適化されます。ははは、自分でコンセプトをこっそり変更して自分で設定することもできます。
SELECT a.`goods_id` , a.`goods_name` , b.brand_nameFROM `ecs_goods` AS a, ecs_brand AS bWHERE a.`brand_id` = b.`brand_id`
SELECT a.`goods_id` , a.`goods_name` , b.brand_nameFROM `ecs_goods` AS a INNER JOIN ecs_brand AS b ON a.`brand_id` = b.`brand_id`
SELECT a.`goods_id` , a.`goods_name` , b.brand_nameFROM `ecs_goods` AS a LEFT JOIN ecs_brand AS b ON a.`brand_id` = b.`brand_id`WHERE b.`field_name`= 123
SELECT a.`goods_id` , a.`goods_name` , b.brand_nameFROM `ecs_goods` AS a, ecs_brand AS bWHERE a.`brand_id` = b.`brand_id`AND b.`field_name`= 123
-- -- 表的结构 `good_tbl`-- CREATE TABLE `good_tbl` ( `good_id` int(10) unsigned NOT NULL auto_increment, `brand_id` int(10) unsigned NOT NULL, PRIMARY KEY (`good_id`)) ENGINE=MyISAM DEFAULT CHARSET=gbk AUTO_INCREMENT=4 ;-- -- 导出表中的数据 `good_tbl`-- INSERT INTO `good_tbl` VALUES (1, 2);INSERT INTO `good_tbl` VALUES (2, 3);INSERT INTO `good_tbl` VALUES (3, 2);
-- -- 表的结构 `brand_tbl`-- CREATE TABLE `brand_tbl` ( `brand_id` int(10) unsigned NOT NULL auto_increment, `brand_name` varchar(50) NOT NULL, PRIMARY KEY (`brand_id`)) ENGINE=MyISAM DEFAULT CHARSET=gbk AUTO_INCREMENT=4 ;-- -- 导出表中的数据 `brand_tbl`-- INSERT INTO `brand_tbl` VALUES (1, '诺基亚');INSERT INTO `brand_tbl` VALUES (3, '三星');
モデレーター: これらの mysql 情報はどこで見つけることができますか? たとえば、特定のステートメントが mysql 内の他のステートメントに最適化されることを確認するにはどうすればよいですか?