2016-08-02 2 views
0

Я пытался оптимизировать свой SQL-запрос и мой SQL-сервер (mariaDB 10.1.10 из xampp 5.6.19) в течение трех дней, но мне нужно ждать ответа сервера более минуты , Иногда я не получаю ответа!оптимизировать медленный SQL-запрос с 23 таблицами

Есть два вопроса, с которыми я столкнулся. Сегодня я переписываю первый запрос из SQL-87-синтаксиса в SQL-92-Syntax, но ускорения не было. Я читал это раньше. Я также читал, что индексы могут значительно ускорить мой запрос, но все мои соединения находятся на клавишах. Не уверен, могу ли я что-нибудь оптимизировать в моей текущей базе данных?

Вот мой первый запрос:

SELECT rv.id AS rahmenID, vls.id AS vlsID, vls.leistungsempfanger AS leistungsempfanger, vls.objektbezeichnung AS objektbezeichnung, 
             str.bezeichnung AS strName, adr.hausnummer AS hausnummer, plz.bezeichnung AS plz, ort.bezeichnung AS ort, land.bezeichnung AS land, 
             produkt.bezeichnung AS produkt, vls.vorjahresverbrauch AS vorjahresverbrauch, vls.lieferbeginn AS lieferbeginn, vls.lieferende AS lieferende, 
             vls.kundennummer_evu AS vertragskonto, anetz.bezeichnung AS ausspeisenetz, mgebiet.bezeichnung AS marktgebiet, qualitat.bezeichnung AS qualitat, 
             lastprofil.bezeichnung AS lastprofil, unVor.name AS vorlieferant, vls.vorlieferant_kundennummer AS vorlieferantKdNr, vls.zahlernummer AS zahlernummer, 
             ls.zahlpunkt AS zahlpunkt, vls.jahreshochstleistung AS jahreshochstleistung, vls.stichtag_abrechnung AS abrechnungsdatum, 
             kennzeichen.bezeichnung AS vertragskennzeichen, kalkArt.bezeichnung AS kalkulationsart, maKalk.vorname AS kalkVorname, maKalk.nachname AS kalkNachname, 
             vls.kalkulationsdatum AS kalkDatum, pb.jahr AS pbJahr, pb.kalenderwoche AS pbKW, maDist.vorname AS distVorname, maDist.nachname AS distNachname, 
             pbt.nne_mess_ka AS nneMessKa, pbt.regelenergie AS regelenergie, pbt.energiesteuer AS energiesteuer, pbt.erdgaspreis AS erdgaspreis, 
             pbt.rohmarge AS rohmarge, pbt.marge_pulsar AS marge_pulsar, pbt.arbeitspreis AS arbeitspreis, pbt.nv_arbeitspreis AS nv_arbeitspreis, 
             pbt.nv_grundpreis AS nv_grundpreis, vStatus.bezeichnung AS vertragsstatus 
           FROM vertrag__rahmen rv 
            INNER JOIN vertrag__lieferstelle__gas vls      ON rv.id       = vls.rahmenID 
            INNER JOIN lieferstelle__gas ls         ON vls.lieferstelle_gasID   = ls.id 
            INNER JOIN address adr           ON ls.addressID      = adr.id 
            INNER JOIN address__strasse str         ON adr.strasse      = str.id 
            INNER JOIN address__plz plz          ON adr.postleitzahl     = plz.id 
            INNER JOIN address__ort ort          ON adr.ort       = ort.id 
            INNER JOIN address__land land         ON adr.land       = land.id 
            INNER JOIN attribut__produkt produkt       ON rv.produktID      = produkt.id 
            INNER JOIN attribut__gas__ausspeisenetz anetz     ON ls.ausspeisenetzID    = anetz.id 
            INNER JOIN attribut__gas__marktgebiet mgebiet     ON ls.marktgebietID     = mgebiet.id 
            INNER JOIN attribut__gas__qualitat qualitat      ON ls.qualitatID     = qualitat.id 
            INNER JOIN attribut__gas__lastprofil lastprofil     ON ls.lastprofilID     = lastprofil.id 
            INNER JOIN unternehmen__evu evuVor        ON vls.vorlieferant     = evuVor.id 
            INNER JOIN unternehmen unVor         ON evuVor.unternehmenID    = unVor.id 
            INNER JOIN attribut__vertrag__kennzeichen kennzeichen   ON vls.vertrag_kennzeichenID  = kennzeichen.id 
            INNER JOIN attribut__vertrag__kalkulationsart kalkArt   ON vls.vertrag_kalkulationsartID = kalkArt.id 
            INNER JOIN mitarbeiter maKalk         ON vls.kalkulator     = maKalk.id 
            INNER JOIN preisblatt__gas pb         ON vls.preisblattID     = pb.id 
            INNER JOIN mitarbeiter maDist         ON vls.distributor     = maDist.id 
            INNER JOIN vertrag__lieferstelle__gas__preisbestandteile pbt ON vls.id       = pbt.vlsGasID 

            INNER JOIN vertrag__lieferstelle__gas__status vlsStatus   ON vls.id       = vlsStatus.vlsGasID 
            INNER JOIN attribut__vertrag__status vStatus     ON vlsStatus.statusID    = vStatus.id 


           WHERE rv.id=11925 AND vlsStatus.id = (SELECT max(tmp.id) FROM vertrag__lieferstelle__gas__status tmp WHERE tmp.vlsGasID=vls.id) 
           ORDER BY vls.lieferstelle_gasID, vls.lieferbeginn 

Если бы это было возможно, я бы дал вам EXPLAIN этого запроса, но я не получу никакого ответа от моей базы данных! :(

Моя база данных:

-- phpMyAdmin SQL Dump 
-- version 4.6.3 
-- https://www.phpmyadmin.net/ 
-- 
-- Host: 127.0.0.1 
-- Erstellungszeit: 02. Aug 2016 um 18:38 
-- Server-Version: 10.1.10-MariaDB-log 
-- PHP-Version: 5.6.19 

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; 
SET time_zone = "+00:00"; 


/*!40101 SET @[email protected]@CHARACTER_SET_CLIENT */; 
/*!40101 SET @[email protected]@CHARACTER_SET_RESULTS */; 
/*!40101 SET @[email protected]@COLLATION_CONNECTION */; 
/*!40101 SET NAMES utf8mb4 */; 



CREATE TABLE `address` (
    `id` int(11) NOT NULL, 
    `strasse` int(11) NOT NULL, 
    `hausnummer` varchar(10) NOT NULL, 
    `postleitzahl` int(11) NOT NULL, 
    `ort` int(11) NOT NULL, 
    `land` int(11) NOT NULL, 
    `angelegt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    `angelegt_durch` int(11) NOT NULL, 
    `aktualisiert` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, 
    `aktualisiert_durch` int(11) DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 



CREATE TABLE `address__ort` (
    `id` int(11) NOT NULL, 
    `bezeichnung` varchar(100) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 



CREATE TABLE `address__plz` (
    `id` int(11) NOT NULL, 
    `bezeichnung` char(5) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

-- -------------------------------------------------------- 


CREATE TABLE `address__strasse` (
    `id` int(11) NOT NULL, 
    `bezeichnung` varchar(250) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 



CREATE TABLE `attribut__gas__ausspeisenetz` (
    `id` int(11) NOT NULL, 
    `bezeichnung` varchar(250) NOT NULL, 
    `beschreibung` varchar(500) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 



CREATE TABLE `attribut__gas__lastprofil` (
    `id` int(11) NOT NULL, 
    `bezeichnung` varchar(6) NOT NULL, 
    `beschreibung` varchar(500) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 



CREATE TABLE `attribut__gas__marktgebiet` (
    `id` int(11) NOT NULL, 
    `bezeichnung` varchar(20) NOT NULL, 
    `beschreibung` varchar(500) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 



CREATE TABLE `attribut__gas__qualitat` (
    `id` int(11) NOT NULL, 
    `bezeichnung` varchar(50) NOT NULL, 
    `beschreibung` varchar(500) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 


CREATE TABLE `attribut__produkt` (
    `id` int(11) NOT NULL, 
    `bezeichnung` varchar(50) NOT NULL, 
    `beschreibung` varchar(500) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 


CREATE TABLE `attribut__vertrag__kalkulationsart` (
    `id` int(11) NOT NULL, 
    `bezeichnung` varchar(250) NOT NULL, 
    `beschreibung` varchar(500) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 



CREATE TABLE `attribut__vertrag__kennzeichen` (
    `id` int(11) NOT NULL, 
    `bezeichnung` varchar(30) NOT NULL, 
    `beschreibung` varchar(500) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 



CREATE TABLE `attribut__vertrag__status` (
    `id` int(11) NOT NULL, 
    `bezeichnung` varchar(250) NOT NULL, 
    `beschreibung` varchar(500) DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 


CREATE TABLE `lieferstelle__gas` (
    `id` int(11) NOT NULL, 
    `addressID` int(11) NOT NULL, 
    `ausspeisenetzID` int(11) NOT NULL, 
    `marktgebietID` int(11) NOT NULL, 
    `lastprofilID` int(11) NOT NULL, 
    `qualitatID` int(11) NOT NULL, 
    `zahlpunkt` varchar(33) DEFAULT NULL, 
    `angelegt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    `angelegt_durch` int(11) NOT NULL, 
    `aktualisiert` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, 
    `aktualisiert_durch` int(11) DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 


CREATE TABLE `mitarbeiter` (
    `id` int(11) NOT NULL, 
    `geschlecht` varchar(1) DEFAULT NULL, 
    `titel` int(11) DEFAULT NULL, 
    `vorname` varchar(50) DEFAULT NULL, 
    `nachname` varchar(50) DEFAULT NULL, 
    `geburtsname` varchar(50) DEFAULT NULL, 
    `anmerkung` varchar(500) DEFAULT NULL, 
    `geburtsdatum` date DEFAULT NULL, 
    `mitarbeiterNr` varchar(20) DEFAULT NULL, 
    `foto_dateityp` varchar(150) DEFAULT NULL, 
    `foto_size` int(11) DEFAULT NULL, 
    `foto_width` int(6) DEFAULT NULL, 
    `foto_height` int(6) DEFAULT NULL, 
    `anzeigen` tinyint(1) NOT NULL DEFAULT '1', 
    `angelegt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    `angelegt_durch` int(11) NOT NULL, 
    `aktualisiert` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, 
    `aktualisiert_durch` int(11) DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 



CREATE TABLE `preisblatt__gas` (
    `id` int(11) NOT NULL, 
    `evuID` int(11) NOT NULL COMMENT 'Lieferant', 
    `marktgebietID` int(11) NOT NULL COMMENT 'Marktgebiet', 
    `erdgasqualitatID` int(11) NOT NULL COMMENT 'Erdgasqualität', 
    `kalenderwoche` int(2) NOT NULL, 
    `jahr` int(4) NOT NULL, 
    `gultig_von` date NOT NULL, 
    `gultig_bis` date NOT NULL, 
    `angelegt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    `angelegt_durch` int(11) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 



CREATE TABLE `unternehmen` (
    `id` int(11) NOT NULL, 
    `unternehmenNr` varchar(10) DEFAULT NULL, 
    `name` varchar(250) NOT NULL, 
    `kurzel` varchar(5) DEFAULT NULL, 
    `strasse` int(11) NOT NULL, 
    `hausnummer` varchar(5) NOT NULL, 
    `postleitzahl` int(11) NOT NULL, 
    `ort` int(11) NOT NULL, 
    `bundesland` int(11) DEFAULT NULL, 
    `land` int(11) NOT NULL, 
    `postfach` varchar(10) DEFAULT NULL, 
    `postfach_postleitzahl` int(11) DEFAULT NULL, 
    `postfach_ort` int(11) DEFAULT NULL, 
    `postfach_land` int(11) DEFAULT NULL, 
    `url` varchar(150) DEFAULT NULL, 
    `bemerkung` varchar(500) DEFAULT NULL, 
    `foto_dateityp` varchar(150) DEFAULT NULL, 
    `foto_size` int(11) DEFAULT NULL, 
    `foto_width` int(6) DEFAULT NULL, 
    `foto_height` int(6) DEFAULT NULL, 
    `angelegt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    `angelegt_durch` int(11) NOT NULL, 
    `aktualisiert` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, 
    `aktualisiert_durch` int(11) DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 


CREATE TABLE `unternehmen__evu` (
    `id` int(11) NOT NULL, 
    `unternehmenID` int(11) NOT NULL, 
    `jahresumsatz` double DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 


CREATE TABLE `vertrag__lieferstelle__gas` (
    `id` int(11) NOT NULL, 
    `rahmenID` int(11) NOT NULL, 
    `maklerID` int(11) NOT NULL, 
    `lieferstelle_gasID` int(11) NOT NULL, 
    `leistungsempfanger` varchar(250) DEFAULT NULL, 
    `objektbezeichnung` varchar(10) DEFAULT NULL, 
    `lieferbeginn` date NOT NULL, 
    `lieferende` date NOT NULL, 
    `kundennummer_evu` varchar(20) DEFAULT NULL, 
    `vorlieferant` int(11) NOT NULL, 
    `vorlieferant_kundennummer` varchar(30) DEFAULT NULL, 
    `zahlernummer` varchar(20) NOT NULL COMMENT 'zum Vertragsabschluss', 
    `vorjahresverbrauch` double NOT NULL COMMENT 'in kWh', 
    `jahreshochstleistung` double DEFAULT NULL, 
    `preisblattID` int(11) NOT NULL, 
    `stichtag_abrechnung` date NOT NULL, 
    `vertrag_kennzeichenID` int(11) NOT NULL, 
    `vertrag_kalkulationsartID` int(11) NOT NULL, 
    `kalkulationsdatum` date NOT NULL, 
    `kalkulator` int(11) NOT NULL COMMENT 'Excel-Berechner (mitarbeiterID)', 
    `distributor` int(11) NOT NULL COMMENT 'Verkäufer Außendienst (mitarbeiterID)', 
    `angelegt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    `angelegt_durch` int(11) NOT NULL, 
    `aktualisiert` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, 
    `aktualisiert_durch` int(11) DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 


CREATE TABLE `vertrag__lieferstelle__gas__preisbestandteile` (
    `vlsGasID` int(11) NOT NULL, 
    `nne_mess_ka` double DEFAULT NULL, 
    `regelenergie` double DEFAULT NULL, 
    `energiesteuer` double DEFAULT NULL, 
    `erdgaspreis` double DEFAULT NULL, 
    `rohmarge` double DEFAULT NULL, 
    `marge_vp` double DEFAULT NULL, 
    `arbeitspreis` double DEFAULT NULL, 
    `nv_arbeitspreis` double DEFAULT NULL COMMENT 'Summe aus allen', 
    `nv_grundpreis` double DEFAULT NULL, 
    `temp` int(11) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 


CREATE TABLE `vertrag__lieferstelle__gas__status` (
    `id` int(11) NOT NULL, 
    `vlsGasID` int(11) NOT NULL, 
    `statusID` int(11) NOT NULL, 
    `angelegt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    `angelegt_durch` int(11) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 


CREATE TABLE `vertrag__rahmen` (
    `id` int(11) NOT NULL, 
    `vertragsnummer` varchar(30) NOT NULL, 
    `evuID` int(11) NOT NULL, 
    `verwalterID` int(11) NOT NULL, 
    `maklerID` int(11) NOT NULL, 
    `produktID` int(11) NOT NULL, 
    `abschlussdatum` date NOT NULL, 
    `bemerkung` varchar(500) NOT NULL, 
    `angelegt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    `angelegt_durch` int(11) NOT NULL, 
    `aktualisiert` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, 
    `aktualisiert_durch` int(11) DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 


ALTER TABLE `address` 
    ADD PRIMARY KEY (`id`), 
    ADD KEY `strasse` (`strasse`), 
    ADD KEY `postleitzahl` (`postleitzahl`), 
    ADD KEY `ort` (`ort`), 
    ADD KEY `land` (`land`), 
    ADD KEY `angelegt_durch` (`angelegt_durch`), 
    ADD KEY `aktualisiert_durch` (`aktualisiert_durch`); 


ALTER TABLE `address__ort` 
    ADD PRIMARY KEY (`id`), 
    ADD UNIQUE KEY `bezeichnung` (`bezeichnung`); 

ALTER TABLE `address__plz` 
    ADD PRIMARY KEY (`id`), 
    ADD UNIQUE KEY `bezeichnung` (`bezeichnung`); 


ALTER TABLE `address__strasse` 
    ADD PRIMARY KEY (`id`), 
    ADD UNIQUE KEY `bezeichnung` (`bezeichnung`); 

ALTER TABLE `attribut__gas__ausspeisenetz` 
    ADD PRIMARY KEY (`id`); 

ALTER TABLE `attribut__gas__lastprofil` 
    ADD PRIMARY KEY (`id`); 

ALTER TABLE `attribut__gas__marktgebiet` 
    ADD PRIMARY KEY (`id`); 

ALTER TABLE `attribut__gas__qualitat` 
    ADD PRIMARY KEY (`id`); 

ALTER TABLE `attribut__produkt` 
    ADD PRIMARY KEY (`id`); 

ALTER TABLE `attribut__vertrag__kalkulationsart` 
    ADD PRIMARY KEY (`id`); 

ALTER TABLE `attribut__vertrag__kennzeichen` 
    ADD PRIMARY KEY (`id`); 


ALTER TABLE `attribut__vertrag__status` 
    ADD PRIMARY KEY (`id`), 
    ADD UNIQUE KEY `bezeichnung` (`bezeichnung`); 

ALTER TABLE `lieferstelle__gas` 
    ADD PRIMARY KEY (`id`), 
    ADD KEY `lieferstelleID` (`addressID`), 
    ADD KEY `ausspeisenetzID` (`ausspeisenetzID`), 
    ADD KEY `marktgebietID` (`marktgebietID`), 
    ADD KEY `zahlertypID` (`lastprofilID`), 
    ADD KEY `qualitatID` (`qualitatID`), 
    ADD KEY `angelegt_durch` (`angelegt_durch`), 
    ADD KEY `aktualisiert_durch` (`aktualisiert_durch`); 

ALTER TABLE `mitarbeiter` 
    ADD PRIMARY KEY (`id`), 
    ADD KEY `mitarbeiterID` (`id`), 
    ADD KEY `titel` (`titel`), 
    ADD KEY `angelegt_durch` (`angelegt_durch`), 
    ADD KEY `aktualisiert_durch` (`aktualisiert_durch`); 
ALTER TABLE `mitarbeiter` ADD FULLTEXT KEY `vorname` (`vorname`); 
ALTER TABLE `mitarbeiter` ADD FULLTEXT KEY `nachname` (`nachname`); 
ALTER TABLE `mitarbeiter` ADD FULLTEXT KEY `vorname_2` (`vorname`,`nachname`); 

ALTER TABLE `preisblatt__gas` 
    ADD PRIMARY KEY (`id`), 
    ADD KEY `preisblattID` (`id`), 
    ADD KEY `unternehmen_evuID` (`evuID`), 
    ADD KEY `lieferstelle_marktgebietID` (`marktgebietID`), 
    ADD KEY `lieferstelle_erdgasqualitatID` (`erdgasqualitatID`), 
    ADD KEY `angelegt_durch` (`angelegt_durch`), 
    ADD KEY `datum` (`jahr`,`kalenderwoche`) USING BTREE; 


ALTER TABLE `unternehmen` 
    ADD PRIMARY KEY (`id`), 
    ADD UNIQUE KEY `name` (`name`), 
    ADD UNIQUE KEY `kurzel` (`kurzel`), 
    ADD UNIQUE KEY `unternehmenNr` (`unternehmenNr`), 
    ADD KEY `angelegt_durch` (`angelegt_durch`), 
    ADD KEY `aktualisiert_durch` (`aktualisiert_durch`), 
    ADD KEY `strasse` (`strasse`), 
    ADD KEY `postleitzahl` (`postleitzahl`), 
    ADD KEY `ort` (`ort`), 
    ADD KEY `bundesland` (`bundesland`), 
    ADD KEY `land` (`land`), 
    ADD KEY `postfach_postleitzahl` (`postfach_postleitzahl`), 
    ADD KEY `postfach_ort` (`postfach_ort`), 
    ADD KEY `postfach_land` (`postfach_land`); 

ALTER TABLE `unternehmen__evu` 
    ADD PRIMARY KEY (`id`), 
    ADD UNIQUE KEY `unternehmenID_2` (`unternehmenID`), 
    ADD KEY `unternehmenID` (`unternehmenID`); 

ALTER TABLE `vertrag__lieferstelle__gas` 
    ADD PRIMARY KEY (`id`), 
    ADD KEY `vertrag_kennzeichenID` (`vertrag_kennzeichenID`), 
    ADD KEY `lieferstelleID` (`lieferstelle_gasID`), 
    ADD KEY `preisblattID` (`preisblattID`), 
    ADD KEY `distributor` (`distributor`), 
    ADD KEY `maklerID` (`maklerID`), 
    ADD KEY `angelegt_durch` (`angelegt_durch`), 
    ADD KEY `aktualisiert_durch` (`aktualisiert_durch`), 
    ADD KEY `kalkulator` (`kalkulator`), 
    ADD KEY `rahmenID` (`rahmenID`), 
    ADD KEY `vorlieferant` (`vorlieferant`), 
    ADD KEY `vertrag_berechnungsartID` (`vertrag_kalkulationsartID`), 
    ADD KEY `lieferbeginn` (`lieferbeginn`), 
    ADD KEY `lieferende` (`lieferende`), 
    ADD KEY `anlage2index` (`id`,`rahmenID`,`lieferstelle_gasID`,`vorlieferant`,`preisblattID`,`vertrag_kennzeichenID`,`vertrag_kalkulationsartID`,`kalkulator`,`distributor`) USING BTREE; 

ALTER TABLE `vertrag__lieferstelle__gas__preisbestandteile` 
    ADD PRIMARY KEY (`vlsGasID`); 

ALTER TABLE `vertrag__lieferstelle__gas__status` 
    ADD PRIMARY KEY (`id`), 
    ADD KEY `angelegt_durch` (`angelegt_durch`), 
    ADD KEY `vlsGasID` (`vlsGasID`), 
    ADD KEY `statusID` (`statusID`); 


ALTER TABLE `vertrag__rahmen` 
    ADD PRIMARY KEY (`id`), 
    ADD UNIQUE KEY `unternehmen_evuID_2` (`evuID`,`produktID`,`verwalterID`) USING BTREE, 
    ADD KEY `unternehmen_evuID` (`evuID`), 
    ADD KEY `unternehmen_verwalterID` (`verwalterID`), 
    ADD KEY `unternehmen_maklerID` (`maklerID`), 
    ADD KEY `produktID` (`produktID`), 
    ADD KEY `angelegt_durch` (`angelegt_durch`), 
    ADD KEY `aktualisiert_durch` (`aktualisiert_durch`); 



ALTER TABLE `address` 
    ADD CONSTRAINT `address_ibfk_05` FOREIGN KEY (`strasse`) REFERENCES `address__strasse` (`id`) ON UPDATE CASCADE, 
    ADD CONSTRAINT `address_ibfk_06` FOREIGN KEY (`postleitzahl`) REFERENCES `address__plz` (`id`) ON UPDATE CASCADE, 
    ADD CONSTRAINT `address_ibfk_07` FOREIGN KEY (`ort`) REFERENCES `address__ort` (`id`) ON UPDATE CASCADE, 
    ADD CONSTRAINT `address_ibfk_08` FOREIGN KEY (`land`) REFERENCES `address__land` (`id`) ON UPDATE CASCADE, 
    ADD CONSTRAINT `address_ibfk_09` FOREIGN KEY (`angelegt_durch`) REFERENCES `db__user` (`id`) ON UPDATE CASCADE, 
    ADD CONSTRAINT `address_ibfk_10` FOREIGN KEY (`aktualisiert_durch`) REFERENCES `db__user` (`id`) ON UPDATE CASCADE; 


ALTER TABLE `lieferstelle__gas` 
    ADD CONSTRAINT `lieferstelle_gas_ibfk_01` FOREIGN KEY (`addressID`) REFERENCES `address` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, 
    ADD CONSTRAINT `lieferstelle_gas_ibfk_02` FOREIGN KEY (`ausspeisenetzID`) REFERENCES `attribut__gas__ausspeisenetz` (`id`) ON UPDATE CASCADE, 
    ADD CONSTRAINT `lieferstelle_gas_ibfk_03` FOREIGN KEY (`marktgebietID`) REFERENCES `attribut__gas__marktgebiet` (`id`) ON UPDATE CASCADE, 
    ADD CONSTRAINT `lieferstelle_gas_ibfk_04` FOREIGN KEY (`lastprofilID`) REFERENCES `attribut__gas__lastprofil` (`id`) ON UPDATE CASCADE, 
    ADD CONSTRAINT `lieferstelle_gas_ibfk_05` FOREIGN KEY (`qualitatID`) REFERENCES `attribut__gas__qualitat` (`id`) ON UPDATE CASCADE, 
    ADD CONSTRAINT `lieferstelle_gas_ibfk_06` FOREIGN KEY (`angelegt_durch`) REFERENCES `db__user` (`id`) ON UPDATE CASCADE, 
    ADD CONSTRAINT `lieferstelle_gas_ibfk_07` FOREIGN KEY (`aktualisiert_durch`) REFERENCES `db__user` (`id`) ON UPDATE CASCADE; 


ALTER TABLE `mitarbeiter` 
    ADD CONSTRAINT `mitarbeiter_ibfk_1` FOREIGN KEY (`titel`) REFERENCES `attribut__mitarbeiter__titel` (`id`) ON UPDATE CASCADE, 
    ADD CONSTRAINT `mitarbeiter_ibfk_2` FOREIGN KEY (`angelegt_durch`) REFERENCES `db__user` (`id`) ON UPDATE CASCADE, 
    ADD CONSTRAINT `mitarbeiter_ibfk_3` FOREIGN KEY (`aktualisiert_durch`) REFERENCES `db__user` (`id`) ON UPDATE CASCADE; 


ALTER TABLE `preisblatt__gas` 
    ADD CONSTRAINT `preisblatt__gas_ibfk_1` FOREIGN KEY (`evuID`) REFERENCES `unternehmen__evu` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, 
    ADD CONSTRAINT `preisblatt__gas_ibfk_2` FOREIGN KEY (`marktgebietID`) REFERENCES `attribut__gas__marktgebiet` (`id`) ON UPDATE CASCADE, 
    ADD CONSTRAINT `preisblatt__gas_ibfk_3` FOREIGN KEY (`erdgasqualitatID`) REFERENCES `attribut__gas__qualitat` (`id`) ON UPDATE CASCADE, 
    ADD CONSTRAINT `preisblatt__gas_ibfk_4` FOREIGN KEY (`angelegt_durch`) REFERENCES `db__user` (`id`) ON UPDATE CASCADE; 


ALTER TABLE `unternehmen` 
    ADD CONSTRAINT `unternehmen_ibfk_1` FOREIGN KEY (`angelegt_durch`) REFERENCES `db__user` (`id`) ON UPDATE CASCADE, 
    ADD CONSTRAINT `unternehmen_ibfk_10` FOREIGN KEY (`postfach_land`) REFERENCES `address__land` (`id`) ON UPDATE CASCADE, 
    ADD CONSTRAINT `unternehmen_ibfk_2` FOREIGN KEY (`aktualisiert_durch`) REFERENCES `db__user` (`id`) ON UPDATE CASCADE, 
    ADD CONSTRAINT `unternehmen_ibfk_3` FOREIGN KEY (`strasse`) REFERENCES `address__strasse` (`id`) ON UPDATE CASCADE, 
    ADD CONSTRAINT `unternehmen_ibfk_4` FOREIGN KEY (`postleitzahl`) REFERENCES `address__plz` (`id`) ON UPDATE CASCADE, 
    ADD CONSTRAINT `unternehmen_ibfk_5` FOREIGN KEY (`ort`) REFERENCES `address__ort` (`id`) ON UPDATE CASCADE, 
    ADD CONSTRAINT `unternehmen_ibfk_6` FOREIGN KEY (`bundesland`) REFERENCES `address__bundesland` (`id`) ON UPDATE CASCADE, 
    ADD CONSTRAINT `unternehmen_ibfk_7` FOREIGN KEY (`land`) REFERENCES `address__land` (`id`) ON UPDATE CASCADE, 
    ADD CONSTRAINT `unternehmen_ibfk_8` FOREIGN KEY (`postfach_postleitzahl`) REFERENCES `address__plz` (`id`) ON UPDATE CASCADE, 
    ADD CONSTRAINT `unternehmen_ibfk_9` FOREIGN KEY (`postfach_ort`) REFERENCES `address__ort` (`id`) ON UPDATE CASCADE; 

ALTER TABLE `unternehmen__evu` 
    ADD CONSTRAINT `unternehmen__evu_ibfk_1` FOREIGN KEY (`unternehmenID`) REFERENCES `unternehmen` (`id`) ON DELETE CASCADE ON UPDATE CASCADE; 


ALTER TABLE `vertrag__lieferstelle__gas` 
    ADD CONSTRAINT `vertrag__lieferstelle__gas_ibfk_01` FOREIGN KEY (`rahmenID`) REFERENCES `vertrag__rahmen` (`id`) ON UPDATE CASCADE, 
    ADD CONSTRAINT `vertrag__lieferstelle__gas_ibfk_02` FOREIGN KEY (`maklerID`) REFERENCES `unternehmen__makler` (`id`) ON UPDATE CASCADE, 
    ADD CONSTRAINT `vertrag__lieferstelle__gas_ibfk_03` FOREIGN KEY (`lieferstelle_gasID`) REFERENCES `lieferstelle__gas` (`id`) ON UPDATE CASCADE, 
    ADD CONSTRAINT `vertrag__lieferstelle__gas_ibfk_04` FOREIGN KEY (`preisblattID`) REFERENCES `preisblatt__gas` (`id`) ON UPDATE CASCADE, 
    ADD CONSTRAINT `vertrag__lieferstelle__gas_ibfk_06` FOREIGN KEY (`vertrag_kennzeichenID`) REFERENCES `attribut__vertrag__kennzeichen` (`id`) ON UPDATE CASCADE, 
    ADD CONSTRAINT `vertrag__lieferstelle__gas_ibfk_07` FOREIGN KEY (`vertrag_kalkulationsartID`) REFERENCES `attribut__vertrag__kalkulationsart` (`id`) ON UPDATE CASCADE, 
    ADD CONSTRAINT `vertrag__lieferstelle__gas_ibfk_08` FOREIGN KEY (`kalkulator`) REFERENCES `mitarbeiter` (`id`) ON UPDATE CASCADE, 
    ADD CONSTRAINT `vertrag__lieferstelle__gas_ibfk_09` FOREIGN KEY (`distributor`) REFERENCES `mitarbeiter` (`id`) ON UPDATE CASCADE, 
    ADD CONSTRAINT `vertrag__lieferstelle__gas_ibfk_10` FOREIGN KEY (`angelegt_durch`) REFERENCES `db__user` (`id`) ON UPDATE CASCADE, 
    ADD CONSTRAINT `vertrag__lieferstelle__gas_ibfk_11` FOREIGN KEY (`aktualisiert_durch`) REFERENCES `db__user` (`id`) ON UPDATE CASCADE, 
    ADD CONSTRAINT `vertrag__lieferstelle__gas_ibfk_12` FOREIGN KEY (`vorlieferant`) REFERENCES `unternehmen__evu` (`id`) ON UPDATE CASCADE; 


ALTER TABLE `vertrag__lieferstelle__gas__preisbestandteile` 
    ADD CONSTRAINT `vlsGas_pb2_ibfk_01` FOREIGN KEY (`vlsGasID`) REFERENCES `vertrag__lieferstelle__gas` (`id`) ON DELETE CASCADE ON UPDATE CASCADE; 


ALTER TABLE `vertrag__lieferstelle__gas__status` 
    ADD CONSTRAINT `vlsGasStatus_ibfk_01` FOREIGN KEY (`vlsGasID`) REFERENCES `vertrag__lieferstelle__gas` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, 
    ADD CONSTRAINT `vlsGasStatus_ibfk_02` FOREIGN KEY (`statusID`) REFERENCES `attribut__vertrag__status` (`id`) ON UPDATE CASCADE; 


ALTER TABLE `vertrag__rahmen` 
    ADD CONSTRAINT `vertrag__rahmen_ibfk_01` FOREIGN KEY (`evuID`) REFERENCES `unternehmen__evu` (`id`) ON UPDATE CASCADE, 
    ADD CONSTRAINT `vertrag__rahmen_ibfk_02` FOREIGN KEY (`verwalterID`) REFERENCES `unternehmen__verwalter` (`id`) ON UPDATE CASCADE, 
    ADD CONSTRAINT `vertrag__rahmen_ibfk_03` FOREIGN KEY (`maklerID`) REFERENCES `unternehmen__makler` (`id`) ON UPDATE CASCADE, 
    ADD CONSTRAINT `vertrag__rahmen_ibfk_04` FOREIGN KEY (`produktID`) REFERENCES `attribut__produkt` (`id`) ON UPDATE CASCADE, 
    ADD CONSTRAINT `vertrag__rahmen_ibfk_05` FOREIGN KEY (`angelegt_durch`) REFERENCES `db__user` (`id`) ON UPDATE CASCADE, 
    ADD CONSTRAINT `vertrag__rahmen_ibfk_06` FOREIGN KEY (`aktualisiert_durch`) REFERENCES `db__user` (`id`) ON UPDATE CASCADE; 

мой my.ini:

[mysqld] 
port= 3306 
socket = "C:/xampp/mysql/mysql.sock" 
basedir = "C:/xampp/mysql" 
tmpdir = "C:/xampp/tmp" 
datadir = "C:/xampp/mysql/data" 
pid_file = "mysql.pid" 
# enable-named-pipe 
key_buffer = 16M 
max_allowed_packet = 1M 
sort_buffer_size = 512K 
net_buffer_length = 8K 
read_buffer_size = 256K 
read_rnd_buffer_size = 512K 
myisam_sort_buffer_size = 8M 
log_error = "mysql_error.log" 

slow_query_log=ON 
long_query_time=1 
table_open_cache=10000 
thread_cache_size=25 
query_cache_type=ON 
query_cache_size=128MiB 
query_cache_limit=100MiB 
tmp_table_size=64MiB 

Спасибо за вашу помощь

редактировать: Я узнал, что запрос начинает медленно от «INNER JOIN vertrag__lieferstelle__gas__preisbestandteile pbt ...», а другой - после него.

+0

Сколько времени требуется для запуска 'EXPLAIN SELECT ...'? Пожалуйста, покажите результаты из таких. –

+0

Где находится 'tmp'? Он нуждается в 'INDEX (vlsGasID, id)'. –

ответ

0

Сколько у вас RAM? Поскольку я не вижу innodb_buffer_pool_size в вашем my.ini, я подозреваю, что вы используете низкий уровень по умолчанию. Установите его примерно в 70% от . Доступно ОЗУ. Это должно помочь этому запросу и другим.

table_open_cache=10000 -- lower to 3000 
query_cache_size=128MiB -- lower to 50M 
tmp_table_size=64MiB -- not more than 1% of RAM 

Другие ноты:

  • jahr INT (4) NOT NULL, - Почему бы не использовать YEAR тип данных?
  • INT(2) - (2) ничего не говорит; возможно, вы имели в виду TINYINT?
  • char(5) - вы, вероятно, хотите CHAR(5) CHARACTER SET ascii, в противном случае вы выделяете 15 байт из-за utf8.

Из-за большого количества таблиц нормализации, это может помощь:

SET @@optimizer_search_depth=1 

Вы можете вероятно тест его полезность, пробуя EXPLAIN SELECT ... с ним 1 против значения по умолчанию 62.

+0

«SET @@ optimizer_search_depth = 5» помогли! : D – Sascha

0

Нет т уверены, сколько разница он будет делать с запросом на 23 таблицы, но я обычно стараюсь избегать коррелированные подзапросы, как один используется здесь:

vlsStatus.id = (SELECT max(tmp.id) FROM vertrag__lieferstelle__gas__status tmp WHERE tmp.vlsGasID=vls.id)

Вместо попробовать это:

(vls.id, vlsStatus.id) IN (SELECT vlsGasID, max(id) FROM vertrag__lieferstelle__gas__status GROUP BY vlsGasID)

подзапрос будет работать только один раз (по сравнению с один раз для каждого результата во внешнем запросе с коррелированными версии)

Редактировать: Кроме того, это может не повлиять на производительность, но я обычно стараюсь помещать таблицы, указанные в WHERE ранее в последовательности JOIN, когда это возможно.

Edit2: Еще одна возможность заключается в том, чтобы создать временную таблицу с подзапроса, индексировать временную таблицу надлежащим (оба поля), и включить его в РЕГИСТРИРУЙТЕСЬ части основного запроса.

+0

Предложение вряд ли поможет, потому что MySQL не оптимизирует 'WHERE (a, b) ...' well. –

+0

Хммм ... Я сомневаюсь, имеет ли дело 'JOIN' порядок. У вас есть ссылка, поддерживающая этот совет? –

+0

@ RickJames Да, я в основном уверен, что заказ 'JOIN' не имеет значения; но это облегчает использование 'SELECT STRAIGHT_JOIN ...' в редких случаях, когда это необходимо. Насколько MySQL оптимизирует 'WHERE (a, b)', мое намерение с этим предложением состояло в том, чтобы предотвратить необходимость коррелированного подзапроса, а не использовать общую оптимизацию, такую ​​как использование индексов. – Uueerdo

Смежные вопросы