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