Reputation: 23
I have this query which gets me some data from a few tables. The query works perfectly, but it takes the server a long time to get the results.
$query_serial = "SELECT serienummers.serienummer, salesregels.aantalartikelen FROM serienummers
LEFT JOIN
(
SELECT aantalartikelen, artikelcode, salescode FROM salesregels
)salesregels ON salesregels.salescode = serienummers.salescode
LEFT JOIN
(
SELECT factuurnummer, code FROM sales
)sales ON sales.code = serienummers.salescode
WHERE serienummer = '$serialnumber' AND salesregels.artikelcode = serienummers.artikelcode AND sales.factuurnummer != '-1'
";
I've read a few thing online about indexing the tables, but im not quite sure how to apply this. Could anyone point me in the right direction, please?
My tables:
Serienummers:
+---------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------------+--------------+------+-----+---------+-------+
| code | int(11) | NO | PRI | 0 | |
| serienummer | varchar(100) | NO | | | |
| artikelcode | int(11) | YES | | 0 | |
| datum | int(11) | NO | | 0 | |
| usercode | int(11) | NO | | 0 | |
| salescode | int(11) | YES | | 0 | |
| reparatiecode | int(11) | YES | | 0 | |
| actie | varchar(250) | NO | | | |
| rmacode | int(11) | NO | | 0 | |
+---------------+--------------+------+-----+---------+-------+
Salesregels
+---------------------------+-------------------------------------------------+-
-----+-----+-----------+-------+
| Field | Type |
Null | Key | Default | Extra |
+---------------------------+-------------------------------------------------+-
-----+-----+-----------+-------+
| code | int(11) |
NO | PRI | 0 | |
| salescode | int(11) |
NO | | 0 | |
| aantalartikelen | double |
NO | | 0 | |
| artikelcode | int(11) |
NO | | 0 | |
| prijsperstukinclbtw_old | varchar(20) |
NO | | 0 | |
| btwtypecode | int(11) |
NO | | 0 | |
| artikeltekst | varchar(250) |
NO | | | |
| procentbtw_old | varchar(10) |
NO | | 0,00 | |
| isprijsonderdrukt | int(11) |
NO | | 0 | |
| volgordenummer | int(11) |
NO | | 0 | |
| prijsperstukinclbtw | double |
NO | | 0 | |
| procentbtw | double |
NO | | 0 | |
| korting | double |
NO | | 0 | |
| kortingtype | enum('procenten','eurosinclbtw','eurosexclbtw') |
NO | | procenten | |
| inkoopprijsperstukexclbtw | double |
NO | | 0 | |
| inkoopprijsprocentbtw | double |
NO | | 0 | |
| inkoopprijsbtwtypecode | int(11) |
NO | | 0 | |
| dagengarantie | int(11) |
NO | | 0 | |
+---------------------------+-------------------------------------------------+-
Sales
+-------------------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------------------+--------------+------+-----+---------+-------+
| code | int(11) | NO | PRI | 0 | |
| salestypecode | int(11) | NO | | 0 | |
| websitesalesidcode | int(11) | NO | | 0 | |
| datum | int(11) | NO | | 0 | |
| datumbetaald | int(11) | NO | | 0 | |
| datumlaatstgewijzigd | int(11) | NO | | 0 | |
| usercodelaatstgewijzigd | int(11) | NO | | 0 | |
| adrescode | int(11) | NO | | 0 | |
| usercode | int(11) | NO | | 0 | |
| bedragvoldaan1_old | varchar(15) | NO | | 0 | |
| bedragvoldaan1 | double | NO | | 0 | |
| betalingswijzecode1 | int(11) | NO | | 0 | |
| bedragvoldaan2_old | varchar(15) | NO | | 0 | |
| bedragvoldaan2 | double | NO | | 0 | |
| betalingswijzecode2 | int(11) | NO | | 0 | |
| opmerkingen | longtext | NO | | NULL | |
| opmerkingenextern | longtext | YES | | NULL | |
| voorraadlokatiecode | int(11) | NO | | 0 | |
| computernaam | varchar(255) | YES | | NULL | |
| factuurnummer | bigint(20) | NO | | 0 | |
| betaald | int(11) | NO | | 1 | |
| status | varchar(255) | YES | | NULL | |
| dagenbetalingstermijn | int(11) | NO | | 8 | |
| externordernummer | varchar(255) | YES | | NULL | |
| externfactuurnummer | varchar(255) | YES | | NULL | |
| isdeleted | int(11) | NO | | 0 | |
+-------------------------+--------------+------+-----+---------+-------+
Upvotes: 0
Views: 438
Reputation: 44844
You do not need selecting everything using inner query before doing the join
.
The joins could be done directly.
select
sr.serienummer,
sg.aantalartikelen
from serienummers sr
left join salesregels sg on sg.salescode = sr.salescode and sg.artikelcode = sr.artikelcode
left join sales s on s.code = sr.salescode
where
sr.serienummer = '$serialnumber'
and s.factuurnummer != '-1' ;
Now to speed up you need indexes on the joining keys and keys used in where clause.
alter table serienummers add index sales_kel_code(salescode,artikelcode);
alter table serienummers add index serienummer_idx(serienummer);
alter table salesregels add index salescode_idx(salescode);
alter table sales add index factuurnummer_idx(factuurnummer);
Upvotes: 1