поиск значения в таблицах mysql с меньшим количеством запросов к базе данных? - PullRequest
0 голосов
/ 07 августа 2010

У меня есть пользователь с его уникальным именем пользователя в таблице MySQL, но я должен проверить и сделать много запросов, чтобы найти его.Интересно, если лучший способ избежать всех делает запросы к БД.

У меня есть несколько строк в таблице с такими столбцами, как user1, user2, user3, user4 до 30.

for ($x=0; $x < 30; $x ++){

    $user = "user"; 
    $user .= $x; //generate user1, user2, user3 etc


    $result=mysql_fetch_object(mysql_query("SELECT * FROM table WHERE ".$user."='".$_SESSION['username']."'"));
    if ($result){

Теперь, если $_SESSION['username']В таблице указано user30. Я делаю 29 запросов, прежде чем значение $result будет истинным, и я могу работать с результатами.Есть лучший способ сделать это?Насколько это важно в любом случае.Есть большая разница в спросе процессора на 1 запрос и 30 запросов?

Ответы [ 6 ]

1 голос
/ 07 августа 2010

Вам нужно нормализовать эту БД. После того, как я несколько раз сделал такую ​​же ошибку (user_1, ..., user_n в одной строке), я узнал о нормализации, и все, что связано с БД, внезапно стало в тысячу раз легче. Введение здесь: http://en.wikipedia.org/wiki/Database_normalization

1 голос
/ 07 августа 2010

Поскольку вы не подстановочный знак поиска, вы можете выполнить этот поиск в одном запросе:

SELECT t.* 
  FROM table t 
 WHERE '".$_SESSION['username']."' IN (t.user1, t.use2, t.user3, t.user4, t.user5,
                                                         -- rest of the columns in the same pattern
                                                         t.user26, t.user27, t.user28, t.user29, t.user30)

Есть ли большая разница между использованием 1 к 30 запросам?

Да - запросы к базе данных следует считать дорогостоящими. Во-первых, накладные расходы связаны с тем, что код приложения отправляет запрос на сервер - SQL передается по TCP. Чем меньше запрос, тем короче передача TCP на сервер - может быть миллисекундами или наносекундами при тестировании одного запроса, но в многопользовательской настройке, которая действительно может сложиться. Тогда есть издержки самого запроса - получите только то, что вам нужно, что означает не использовать «SELECT *». Или зачем вам попадать в базу данных 30 раз, когда вы можете сделать это один раз?

Это трудно понять, когда вы имеете дело с системой, которая поддерживает вас (или, возможно, несколько человек), а приложение и база данных находятся на одном хосте (виртуальная машина - это другое дело). Но затраты все же складываются.

1 голос
/ 07 августа 2010

Как сказал Йохан, вам нужно нормализовать вашу базу данных. Это означает удаление повторяющихся столбцов путем создания дополнительных таблиц. Есть много примеров того, как это сделать; возможно, каноническая - это версия википедии ... http://en.wikipedia.org/wiki/First_normal_form

1 голос
/ 07 августа 2010

Хотя у вас действительно должен быть только один пользовательский столбец, вы можете использовать цикл для создания одного большого запроса, а не 30 маленьких.

<?php
$query = "SELECT * FROM table WHERE ";
foreach(range(1,30) as $num) {
    $query .= " user$num = '{$_SESSION['username']}'";
    if($num < 30) $query .= " OR ";
}
print $query;
$result=mysql_fetch_object(mysql_query($query));
?>
0 голосов
/ 07 августа 2010

Я понятия не имею, почему вам нужно иметь user1 ... user30 в вашей таблице, но в любом случае, чтобы сократить время запроса, вы можете попробовать следующее

<?php         
     $selects = array();
     for($i=1; $i<=30; $i++) {
         $selects[] = "SELECT * FROM `table` WHERE user$i = '" . $_SESSION['username']} . "'"; 
     }

     $query = join(" UNION ", $selects);
     print $query;

Метод UNION предпочтителен, поскольку могут использоваться индексы (user1 ... user30).

0 голосов
/ 07 августа 2010

У вас должен быть один столбец с именем 'user', в котором вы сохраняете имя пользователя.Тогда вам нужен только один выбор, чтобы получить эту строку:

"SELECT * FROM table WHERE user='".$_SESSION['username']."'"

Вот если я вас правильно понял ... У вас есть один столбец для каждого пользователя, что является действительно плохим дизайном примерно в 100% случаев.,У вас должен быть только один пользовательский столбец с именем пользователя в качестве значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...