mysql - 优化23张表的慢sql查询

标签 mysql performance xampp mariadb

我尝试优化我的 SQL 查询和 SQL-Server(来自 xampp 5.6.19 的 mariaDB 10.1.10)三天,但我必须等待服务器响应超过一分钟。有时我得不到答案!

我有两个疑问。今天我将第一个查询从 SQL-87-Syntax 重写为 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

如果可能的话,我会给你这个查询的解释,但我不会从我的数据库得到任何答案! :(

我的数据库:

-- 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 @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@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 ...”开始变慢,并且在它之后的其他连接开始变慢。

最佳答案

你有多少内存?由于我在 my.ini 中没有看到 innodb_buffer_pool_size,我怀疑您使用的是较低的默认值。将其设置为可用 RAM 的 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,否则,您将因为 utf8 分配 15 个字节>.

由于标准化表数量较多,这可能有帮助:

SET @@optimizer_search_depth=1

可能可以通过尝试使用EXPLAIN SELECT ...将其设置为1而不是默认值62来测试其实用性。

关于mysql - 优化23张表的慢sql查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38726307/

相关文章:

php - 无法编辑 config.inc.php

mysql - SQL计数计数两次

mysql - 替换相关查询

java - 是否有 Java 与 C++ 的真实世界基准?

C++11 智能指针总是代替新建/删除?

php - 在 Windows 端口 3307 上运行 MySQL

php - MySQL 到 SQL Server : The conversion of a nvarchar data type to a datetime

mysql - max_allowed_pa​​cket 考虑了什么?

java - 加速 jasperreports

c# - 关于 Visual Studio 和 MySQL 连接的问题