---
title: "Extremt långsam fråga"
type: "forum-thread"
url: "https://www.webforum.nu/amne/databaser-sql/190582-extremt-långsam-fråga"
topic: "Databaser & SQL"
topic_url: "https://www.webforum.nu/amne/databaser-sql"
author: "prplxr"
published: "2012-10-25T09:17:07.000Z"
updated: "2012-10-27T18:16:01.000Z"
replies: 11
views: 1197
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/databaser-sql/190582-extremt-långsam-fråga"
---

# Extremt långsam fråga

## #1 — prplxr, 2012-10-25T09:17Z

Hej!

Har ett skript där man kan mata in ett helt eller en del av ett sökord för att få förslag på liknande sökord för att man sedan enkelt ska kunna välja och importera dessa som sina egna. Hmm, lurigt att förklara.

Frågan ser ut såhär:

```php
$sql = "SELECT DISTINCT Sokord AS so FROM tblSokord WHERE Sokord LIKE '%" . $word . "%' UNION SELECT DISTINCT DoldSokord AS so FROM tblSokord WHERE DoldSokord LIKE '%" . $word . "%' LIMIT 0, 10"
```

Tabellen har drygt 46 000 rader och ytterligare en tabell ska tillföras på ytterligare runt 20 000 rader och detta håller inte måttet. Kan jag optimera den där frågan på något sätt? Behöver hjälp med detta!

Permalänk: https://www.webforum.nu/p/190582

## #2 — nitro2k01, 2012-10-25T09:21Z

Det skulle kunna vara så att LIMIT 0,10 anses tillhöra andra frågan, dvs inte "hela uttrycket" som du kanske förväntar dig. Om det är så bör du lägga till en limit på det första uttrycket också:

```php
$sql = "SELECT DISTINCT Sokord AS so FROM tblSokord WHERE Sokord LIKE '%" . $word . "%' LIMIT 0, 10 UNION SELECT DISTINCT DoldSokord AS so FROM tblSokord WHERE DoldSokord LIKE '%" . $word . "%' LIMIT 0, 10"
```

Du kan ju också kolla hur många rader uttrycket returnerar oförändrat. (med mysql_num_rows())

Permalänk: https://www.webforum.nu/p/2305505

## #3 — prplxr, 2012-10-25T09:24Z

Precis vad jag också funderade på när jag postat frågan. Ska testa det!

Btw, jag använder mig av MySQL 5.5.24.

Permalänk: https://www.webforum.nu/p/2305506

## #4 — nitro2k01, 2012-10-25T09:26Z

När jag funderar på saken, båda sökningarna sker ju io samma tabell. Varför behöver du en UNION?

```php
$sql = "SELECT DISTINCT COALESCE(Sokord, DoldSokord) AS so FROM tblSokord WHERE Sokord LIKE '%" . $word . "%' OR DoldSokord LIKE '%" . $word . "%' LIMIT 0, 10"
```

COALESCE, om du undrar, returnerar det första av de värden som ges till det som inte är NULL. Exempelvis, om en rad matchar DoldSokord och Sokord är null för den raden, returneras DoldSokord.

Permalänk: https://www.webforum.nu/p/2305507

## #5 — prplxr, 2012-10-25T09:28Z

Tack för tipset! Jag hade faktiskt ingen aning om att det ens fanns någon sådant funktionalitet! :o

Permalänk: https://www.webforum.nu/p/2305508

## #6 — nitro2k01, 2012-10-25T09:30Z

Men ett varningens ord. Det där kräver ju att ett tomt fält representeras som just NULL och inte en tom sträng. Då kommer du ju få ett tomt resultat för de rader där DoldSokord matchar och Sokord är en tom sträng.

Permalänk: https://www.webforum.nu/p/2305509

## #7 — prplxr, 2012-10-25T09:38Z

Okej, det är jag med på. Intressant nog har jag ej "Allow NULL" på fälten, ändå får jag inga tomma resultat. Dock har jag inget default value på fälten heller.

Permalänk: https://www.webforum.nu/p/2305512

## #8 — nitro2k01, 2012-10-25T10:02Z

Men det kan ju bero på att din sökning bara returnerar rader där det är Sokord som matchas. Prova

```php
$sql = "SELECT DISTINCT COALESCE(Sokord, DoldSokord) AS so FROM tblSokord WHERE DoldSokord LIKE '%" . $word . "%' LIMIT 0, 10"
```

och se om du får några tomma rader.

Hur är datastrukturen utformad? Vad ska Sokord innehålla om DolSokord innehåller något? (Och tvärtom)

Permalänk: https://www.webforum.nu/p/2305516

## #9 — onkelborg, 2012-10-26T07:13Z

Problemet är din LIKE-sats, den är extremt långsam. Den går inte att optimera, dessvärre. Det du behöver är någon form av fulltextindexering, just nu får den gå igenom rad för rad, tecken för tecken, när den söker.

Permalänk: https://www.webforum.nu/p/2305533

## #10 — aasah, 2012-10-27T15:58Z

En annan sak att se upp med är att aldrig använda IN, UNION (eller andra mängdoperationer) mot ett värde/resultat som kan innehålla NULL. När en sådan fråga faktiskt innehåller NULL tar den en eeeeeeeeevvvviiiiiiiiiiiiiiiiiiiiiiiiiigggghhhhhheeeeeeeeeeeeeettttt. För att undvika det kan man tex se till att NULL-värden istället jämförs under något annat värde.

Permalänk: https://www.webforum.nu/p/2305560

## #11 — nitro2k01, 2012-10-27T18:13Z

aasah: Jag tror du jämför äpplen och päron. Mönstret WHERE x IN (SELECT y FROM &#8230;) är ökänt för att göra frågos snorlångsamma eftersom varje post måste jämföras mot en lista. Däremot finns det ingen större anledning varför UNION skulle bli mycket långsammare om resultaten innehåller NULL. UNION ska ju bara foga samman två listor och på sin höjd kolla att resultaten är unika om man inte kör UNION ALL.

Permalänk: https://www.webforum.nu/p/2305568

## #12 — aasah, 2012-10-27T18:16Z

> **[nitro2k01 skrev:](https://www.webforum.nu/p/1555864)**
>
> aasah: Jag tror du jämför äpplen och päron. Mönstret WHERE x IN (SELECT y FROM …) är ökänt för att göra frågos snorlångsamma eftersom varje post måste jämföras mot en lista. Däremot finns det ingen större anledning varför UNION skulle bli mycket långsammare om resultaten innehåller NULL. UNION ska ju bara foga samman två listor och på sin höjd kolla att resultaten är unika om man inte kör UNION ALL.

Jag är ganska säker på att i alla fall SQL Server har (haft) ett känt problem med mängdjämförelser och NULL-värden. Infon är dock ett par år gammal, så det kanske inte längre är relevant.

Permalänk: https://www.webforum.nu/p/2305569

---

Tråden på webben: https://www.webforum.nu/amne/databaser-sql/190582-extremt-långsam-fråga
