'MYSQL Profiling fast - query slow?
I got a MYSQL query which profiles very fast (0.0004 Sek) but when executed it takes more than 30 seconds. Its a standalone dedicated server, so some power behind it.
You see the query down below. I'm sure it can be drastically improved. I just don't understand where the difference between the profiling values and the actual execution time comes from.
SELECT DISTINCT x.loc_id AS id_a,
hier2.loc_id AS id_b, hier3.loc_id AS id_c, hier5.loc_id AS id_d, hier6.loc_id AS id_e, hier7.loc_id AS id_f, hier8.loc_id AS id_g,
hier2.loc_name AS name_b, hier3.loc_name AS name_c, hier5.loc_name AS name_d, hier6.loc_name AS name_e, hier7.loc_name AS name_f, hier8.loc_name AS name_g
FROM objects AS o
LEFT JOIN geo_xref AS x ON o.id = x.oid
LEFT JOIN locations AS hier2 ON x.hier2 = hier2.loc_id
LEFT JOIN locations AS hier3 ON x.hier3 = hier3.loc_id
LEFT JOIN locations AS hier5 ON x.hier5 = hier5.loc_id
LEFT JOIN locations AS hier6 ON x.hier6 = hier6.loc_id
LEFT JOIN locations AS hier7 ON x.hier7 = hier7.loc_id
LEFT JOIN locations AS hier8 ON x.hier8 = hier8.loc_id
WHERE o.published = 1 AND x.loc_id IS NOT NULL
EXPLAIN
<table id="table_results" class="data">
<thead><tr>
<th>id
</th><th>select_type
</th><th>table
</th><th>type
</th><th>possible_keys
</th><th>key
</th><th>key_len
</th><th>ref
</th><th>rows
</th><th>Extra
</th></tr>
</thead>
<tbody>
<tr class="odd">
<td align="right" class=" nowrap">1</td>
<td class="">SIMPLE</td>
<td class="">x</td>
<td class="">ALL</td>
<td class="">PRIMARY,loc_id,xcon</td>
<td class=""><i>NULL</i></td>
<td class=""><i>NULL</i></td>
<td class=""><i>NULL</i></td>
<td align="right" class=" nowrap">187</td>
<td class="">Using where; Using temporary</td>
</tr>
<tr class="even">
<td align="right" class=" nowrap">1</td>
<td class="">SIMPLE</td>
<td class="">o</td>
<td class="">eq_ref</td>
<td class="">PRIMARY</td>
<td class="">PRIMARY</td>
<td class="">4</td>
<td class="">db.x.oid</td>
<td align="right" class=" nowrap">1</td>
<td class="">Using where</td>
</tr>
<tr class="odd">
<td align="right" class=" nowrap">1</td>
<td class="">SIMPLE</td>
<td class="">hier2</td>
<td class="">ref</td>
<td class="">loc_id</td>
<td class="">loc_id</td>
<td class="">4</td>
<td class="">db.x.hier2</td>
<td align="right" class=" nowrap">5</td>
<td class=""><i>NULL</i></td>
</tr>
<tr class="even">
<td align="right" class=" nowrap">1</td>
<td class="">SIMPLE</td>
<td class="">hier3</td>
<td class="">ref</td>
<td class="">loc_id</td>
<td class="">loc_id</td>
<td class="">4</td>
<td class="">db.x.hier3</td>
<td align="right" class=" nowrap">5</td>
<td class=""><i>NULL</i></td>
</tr>
<tr class="odd">
<td align="right" class=" nowrap">1</td>
<td class="">SIMPLE</td>
<td class="">hier5</td>
<td class="">ref</td>
<td class="">loc_id</td>
<td class="">loc_id</td>
<td class="">4</td>
<td class="">db.x.hier5</td>
<td align="right" class=" nowrap">5</td>
<td class=""><i>NULL</i></td>
</tr>
<tr class="even">
<td align="right" class=" nowrap">1</td>
<td class="">SIMPLE</td>
<td class="">hier6</td>
<td class="">ref</td>
<td class="">loc_id</td>
<td class="">loc_id</td>
<td class="">4</td>
<td class="">db.x.hier6</td>
<td align="right" class=" nowrap">5</td>
<td class=""><i>NULL</i></td>
</tr>
<tr class="odd">
<td align="right" class=" nowrap">1</td>
<td class="">SIMPLE</td>
<td class="">hier7</td>
<td class="">ref</td>
<td class="">loc_id</td>
<td class="">loc_id</td>
<td class="">4</td>
<td class="">db.x.hier7</td>
<td align="right" class=" nowrap">5</td>
<td class=""><i>NULL</i></td>
</tr>
<tr class="even">
<td align="right" class=" nowrap">1</td>
<td class="">SIMPLE</td>
<td class="">hier8</td>
<td class="">ref</td>
<td class="">loc_id</td>
<td class="">loc_id</td>
<td class="">4</td>
<td class="">db.x.hier8</td>
<td align="right" class=" nowrap">5</td>
<td class=""><i>NULL</i></td>
</tr>
</tbody>
</table>
Profiling
Starting 7 µs
Waiting For Query Cache Lock 2 µs
Checking Query Cache For Query 9 µs
Checking Privileges On Cached 2 µs
Checking Permissions 3 µs
Checking Permissions 1 µs
Checking Permissions 1 µs
Checking Permissions 1 µs
Checking Permissions 1 µs
Checking Permissions 1 µs
Checking Permissions 1 µs
Checking Permissions 1 µs
Sending Cached Result To Clien 27 µs
Logging Slow Query 2 µs
Cleaning Up 1 µs
Solution 1:[1]
When profiling, always use the SQL_NO_CACHE key word to disable returning cached query results.
SELECT SQL_NO_CACHE DISTINCT x.loc_id AS id_a,
...
To improve query performance, narrow the result set (by applying criteria in the WHERE clause), and ensure you have an index on locations.loc_id and geo_xref.oid.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 |
