Ich versuche, meine MySQL-Abfragen zu optimieren, und ich brauche etwas Hilfe. Hier ist meine aktuelle Abfrage:MYSQL optimieren & Fragen
SELECT *,
(SELECT name FROM stores WHERE id = products.store_id) AS store_name,
(SELECT username FROM stores WHERE id = products.store_id) AS store_username,
(SELECT region_id FROM stores WHERE id = products.store_id) AS region_id,
(SELECT city_id FROM stores WHERE id = products.store_id) AS city_id,
(SELECT name FROM categories_sub WHERE id = products.subcategory_id) AS subcategory_name,
(SELECT name FROM categories WHERE id = category_id) AS category_name
FROM products
WHERE date_start <= DATE(NOW()) AND date_end >= DATE(NOW())
Ich bin mir ziemlich sicher, dass es schneller sein kann.
Ich habe auch ein Problem, wenn ich versuche, alle Produkte von region_id (durch Hinzufügen von etwas wie "AND region_id = MYID"), es funktioniert nicht, und ich frage mich, ob es funktioniert, und wie ?
Vielen Dank für Ihre Zeit!
Lösung
Hier ist meine letzte Abfrage, wenn es jemand helfen kann:
SELECT p.*,
s.name AS store_name,
cs.name AS subcategory_name,
cat.id AS category_id, cat.name AS category_name,
c.id AS city_id, c.name AS city_name,
r.id AS region_id, r.name AS region_name
FROM products p
JOIN stores s ON (s.id = p.store_id)
JOIN categories_sub cs ON (cs.id = p.subcategory_id)
JOIN categories cat ON (cat.id = cs.category_id)
JOIN cities c ON (c.id = s.city_id)
JOIN regions r ON (r.id = c.region_id)
WHERE DATE(NOW()) BETWEEN p.date_start AND p.date_end
Dank!
Okkkkkk Ich denke, ich verstehe, ich habe versucht, über JOIN zu lesen, aber ich dachte, Unterabfragen wären leichter, aber gibt es einen großen Unterschied zwischen JOIN und Vijays Antwort? –
Vijays Antwort ist eine implizite Verbindung. Er hat das Join-Schlüsselwort nicht explizit verwendet, aber Ihre Datenbank übersetzt SELECTING von mehreren Zielen wie diesem in einen Join. Einen Join wie den hier gezeigten zu verwenden ist einfacher. Sobald Sie mehr über Joins erfahren haben, werden Sie diese bequemer finden als Unterabfragen, die ziemlich ausführlich und viel langsamer als Joins sind. – jeffcook2150
BETWEEN wird vom MySQL-Optimierer gut verarbeitet. Es gibt viele Optimierungen, die es nicht macht, aber BETWEEN sollte einen Index scannen, wenn es möglich ist, und denkt, dass dies der richtige Weg ist. BETWEEN sollte dem obigen entsprechen. – MarkR