phpbar.de logo

Mailinglisten-Archive

[dbs] View-Optimierung

[dbs] View-Optimierung

Mario Batz info at batz.info
Die Jul 21 10:29:47 CEST 2009


Hallo,

ich hab hier einen View aus dem ich von mehreren Feldern die eindeutigen
Werte ermitteln muss. (eindeutige Werte f�r DropDown-Felder auf der Website)
Der View selbst liefert rund 500k Datens�tze. Bei jedem Zugriff dauert es
ca. 9 Sekunden.
Die Tabellen wurden damals als INNODB erstellt obwohl MYISAM auch gehen
w�rde. Eine Test-Umstellung auf MyISAM hat wenig Erfolg gebracht.

Da ich von massig Feldern die eindeutigen Werte ben�tige, ist die Wartezeit
nicht mehr tragbar. Beim 2. Aufruf des Skripts werden nat�rlich die Daten
schneller ermittelt, da MySQL die Daten cached.

Nun stellt sich die Frage wie ich das ganze optimieren kann?!
- Entweder alle m�glichen Felder indizieren
- das Ergebnis des Views in eine Tabelle speichern und diese auslesen



Mit folgendem SQL greife ich f�r jedes einzelne Feld auf den View zu:
---
select distinct 
	Feldnamexyz 
from 
	view_art_umsatz;
---



Der View hat folgenden Aufbau (export von phpMyAdmin):
---
CREATE VIEW `view_art_umsatz` AS 
select 
	`kl_firmatyp`.`kltyp_bez` AS `kltyp_bez`,
	`kl_firma`.`kl_nr` AS `kl_nr`,
	`kl_firma`.`kl_firma` AS `kl_firma`,
	`kl_firma`.`kl_synonym` AS `kl_synonym`,
	`kl_rechnungsgruppe`.`rechgrp_bez` AS `rechgrp_bez`,
	`art_artikelpreisgruppe`.`artpg_bez` AS `artpg_bez`,
	`vk_auftrag`.`at_typ` AS `at_typ`,
	`vk_auftragstatus`.`atst_bez` AS `atst_bez`,
	`vk_auftrag`.`at_lieferscheinnr` AS `at_lieferscheinnr`,
	`vk_auftrag`.`at_lieferscheinam` AS `at_lieferscheinam`,
	year(`vk_auftrag`.`at_lieferscheinam`) AS `at_lieferschein_jahr`,
	quarter(`vk_auftrag`.`at_lieferscheinam`) AS
`at_lieferschein_quartal`,
	month(`vk_auftrag`.`at_lieferscheinam`) AS `at_lieferschein_monat`,
	week(`vk_auftrag`.`at_lieferscheinam`,1) AS
`at_lieferschein_kalenderwoche`,
	dayofmonth(`vk_auftrag`.`at_lieferscheinam`) AS
`at_lieferschein_monatstag`,
	`vk_auftrag`.`at_rechnungnr` AS `at_rechnungnr`,
	`vk_auftrag`.`at_rechnungam` AS `at_rechnungam`,
	year(`vk_auftrag`.`at_rechnungam`) AS `at_rechnung_jahr`,
	quarter(`vk_auftrag`.`at_rechnungam`) AS `at_rechnung_quartal`,
	month(`vk_auftrag`.`at_rechnungam`) AS `at_rechnung_monat`,
	week(`vk_auftrag`.`at_rechnungam`,1) AS `at_rechnung_kalenderwoche`,
	dayofmonth(`vk_auftrag`.`at_rechnungam`) AS `at_rechnung_monatstag`,
	round(`vk_auftrag`.`at_bezahlt`,2) AS `at_bezahlt`,
	`vk_auftrag`.`at_bezahltam` AS `at_bezahltam`,
	`vk_auftragartikel`.`atart_art_nr` AS `atart_art_nr`,
	`vk_auftragartikel`.`atart_art_bez` AS `atart_art_bez`,
	round(`vk_auftragartikel`.`atart_menge`,2) AS `atart_menge`,
	round(`vk_auftragartikel`.`atart_art_inhalt`,2) AS
`atart_art_inhalt`,
	round(`vk_auftragartikel`.`atart_preis`,2) AS `atart_preis`,
	round((`vk_auftragartikel`.`atart_art_inhalt` *
`vk_auftragartikel`.`atart_preis`),2) AS `atart_kistenpreis`,
	round(`art_ust`.`ust_prozentsatz`,2) AS
`ust_prozentsatz`,round((((`vk_auftragartikel`.`atart_art_inhalt` *
`vk_auftragartikel`.`atart_menge`) *
`vk_auftragartikel`.`atart_preis`) * if((`vk_auftrag`.`atst_id` =
6),-(1),1)),2) AS `atart_netto`,
	round(((((`vk_auftragartikel`.`atart_art_inhalt` *
`vk_auftragartikel`.`atart_menge`) * `vk_auftragartikel`.`atart_preis`) *
(`art_ust`.				`ust_prozentsatz` / 100)) *
if((`vk_auftrag`.`atst_id` = 6),-(1),1)),2) AS `atart_mwstbetrag`,
	round(((((`vk_auftragartikel`.`atart_art_inhalt` *
`vk_auftragartikel`.`atart_menge`) * `vk_auftragartikel`.`atart_preis`) * (1
+ (`art_ust`.			`ust_prozentsatz` / 100))) *
if((`vk_auftrag`.`atst_id` = 6),-(1),1)),2) AS `atart_brutto` 

from 
	(`kl_firmatyp` join ((((((`kl_firma` 
		left join `kl_rechnungsgruppe` on((`kl_firma`.`rechgrp_id` =
`kl_rechnungsgruppe`.`rechgrp_id`))) 
		left join `art_artikelpreisgruppe` on((`kl_firma`.`artpg_id`
= `art_artikelpreisgruppe`.`artpg_id`))) 
		left join `vk_auftrag` on((`kl_firma`.`kl_id` =
`vk_auftrag`.`kl_id`))) 
		left join `vk_auftragstatus` on((`vk_auftrag`.`atst_id` =
`vk_auftragstatus`.`atst_id`))) 
		left join `vk_auftragartikel` on((`vk_auftrag`.`at_id` =
`vk_auftragartikel`.`at_id`))) 
		left join `art_ust` on((`vk_auftragartikel`.`ust_id` =
`art_ust`.`ust_id`)))) 

where 
	(`kl_firma`.`kltyp_id` = `kl_firmatyp`.`kltyp_id`);
---
 


Felder von denen ich die eindeutigen Werte ben�tige:
---
"kltyp_bez",
"rechgrp_bez",
"artpg_bez",
"at_typ",
"atst_bez",
"at_lieferschein_jahr",
"at_lieferschein_quartal",
"at_lieferschein_monat",
"at_lieferschein_kalenderwoche",
"at_lieferschein_monatstag",
"at_rechnung_jahr",
"at_rechnung_quartal",
"at_rechnung_monat",
"at_rechnung_kalenderwoche",
"at_rechnung_monatstag",
"at_bezahlt",
"ust_prozentsatz"
---

F�r jeden Hinweis dankbar.


Mit freundlichen Gr��en
Mario Batz 





php::bar PHP Wiki   -   Listenarchive