2016-04-03 3 views
0

Итак, у меня есть база данных из 20 мил + строк, и мне нужна функция поиска. Итак, у меня есть код PDO для поиска, и когда искомое имя пользователя находится в базе данных, оно не очень быстрое, но точное, около 0,9 секунды. Но когда искомое имя пользователя отсутствует в базе данных, оно занимает более 10 секунд.Медленный поиск PHP в базе данных

Вот мой код:

$p = $_GET["p"]; 
    $conn = new PDO("mysql:host=localhost;dbname=x", "x", "x"); 
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $sth = $conn->prepare("SELECT `id` from `dbsearch` WHERE `username` = :p LIMIT 1"); 
    $sth->bindParam(':p', $p); 

    $sth->execute(); 
    $result = $sth->fetchAll(); 

    if($result) 
    { 
    foreach($result as $row) 
    { 
     echo $row["id"]; 
    } 
    } 
    else { 
    echo "none"; 
    } 

Я искал это на StackOverflow, и я мог только найти такие вещи, как сфинкс, что невозможно для меня, так как я нахожусь на общий хостинг (Namecheap)

Кто-нибудь, кто может мне помочь? спасибо.

+3

У вас есть индекс для столбца имени пользователя? –

+0

@kylek Я не очень хорошо разбираюсь в sql или вещах таким образом, я не думаю, что у меня есть индекс. Как добавить это, и нужно ли это только найти искомый столбец (имя пользователя) или вообще? – wtm

ответ

4

Вы, наверное, просто нужен индекс:

create index idx_dbsearch_username_id on dbsearch(username, id) 

Причина, по которой идет медленнее, когда имя не в таблице, так как база данных должна искать всю таблицу, чтобы убедиться, что она не существует. Если имя находится в таблице, то оно может остановиться при первом вхождении. С индексом оба должны быть очень и очень быстрыми.

+2

В чем причина включения столбца id в индекс? –

+0

Правильно, вот и все! В настоящее время это действительно очень быстро в обоих направлениях. Также мне интересно то же самое, что и kyle k, в какой колонке вам нужно указывать и почему? – wtm

+0

@kylek. , , Таким образом, индекс будет охватывать запрос. Это означает, что MySQL не нужно ссылаться на страницы данных - вся информация указана в индексе. В некоторых базах данных первичный ключ не нужен для индекса (или для кластерного индекса), но я предпочитаю быть явным даже в этом случае. –

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