私はMySQLデータベース設計のために、複数のバリアントスキーマを持つことができる製品に頭を下げています。大規模なデータセットのMySQLでのIFNULLのパフォーマンス
base_products
とproducts
というテーブルが必要です。 product
はすべてbase_product
に属します。
は、base_product
から列を継承する必要がありますが、同じ名前の列もいくつかあります。 products
の列データはbase_products
列を上書きしますが、products
の列がNULLでない場合のみです。
製品を取得するためのクエリは、理論的にはこのようなものになります。この場合IFNULL
で
SELECT
p.id,
IFNULL(p.sku, _p.sku) AS sku,
IFNULL(p.ean, _p.ean) AS ean,
IFNULL(p.weight, _p.weight) AS weight
IFNULL(p.unit_id, _p.unit_id) AS unit_id
FROM products AS p
JOIN base_products as _p ON p.id = _p.product_id
WHERE IFNULL(p.weight, _p.weight) > 500
が潜在的に非常に大きなテーブルを照会するために使用されています。
この文脈ではIFNULL
の使用が許容されるでしょうか?または、大規模なデータセットを照会するときにパフォーマンスが低下しますか?しかし
SELECT p.id,
COALESCE(p.sku, _p.sku) AS sku,
COALESCE(p.ean, _p.ean) AS ean,
COALESCE(p.weight, _p.weight) AS weight
COALESCE(p.unit_id, _p.unit_id) AS unit_id
FROM products p JOIN
base_products _p
ON p.id = _p.product_id
WHERE COALESCE(p.weight, _p.weight) > 500;
、パフォーマンスとは何の関係もありません:それはANSI標準関数であるので、
ヒューのダミーデータを作成し、実行方法を知るためにEXPLAINを実行します。 –
sqlのようなものを継承システムのように使用することには注意してください。 – Drew
@ user2864740これは、WHERE IFNULL(p.name、_p.name)= 'something''も動作しなければならないということを付け加えておきます。 'products'のデータの存在に基づいて、どこで行うのかを実際に選択する必要があります – Boyd