Правда ли, что запись имени базы данных в каждом запросе происходит быстрее, чем вызов mysql_select_db () при каждой загрузке страницы? - PullRequest
2 голосов
/ 17 сентября 2010

Я работаю на довольно большом сайте; у нас ~ 400-500 миллионов просмотров страниц в месяц. Мы используем PHP и MySQL.

В настоящее время наш поток страниц работает следующим образом (для ясности полупсевдокод):

mysql_connect();
mysql_select_db('red');
mysql_query('SELECT * FROM apples');
mysql_query('SELECT * FROM cakes');

Один из моих коллег предположил, что mysql_select_db замедляет загрузку страниц и увеличивает нагрузку на сервер БД, и предложил изменить наш «поток» так:

mysql_connect();
mysql_query('SELECT * FROM red.apples');
mysql_query('SELECT * FROM red.cakes');

Правда ли, что это будет иметь значение? Я особенно обеспокоен временем, которое потребуется, чтобы сделать это изменение; мы увидим заметные результаты?

Стоит ли это того?

Ответы [ 3 ]

8 голосов
/ 17 сентября 2010

Benchmark:

$ cat 1.php 
<?php
mysql_connect('localhost') or die(mysql_error());
mysql_select_db('test') or die(mysql_error());
mysql_query('SELECT SQL_NO_CACHE * FROM foo') or die(mysql_error());
mysql_query('SELECT SQL_NO_CACHE * FROM bar') or die(mysql_error());
?>
$ cat 2.php 
<?php
mysql_connect('localhost') or die(mysql_error());
mysql_query('SELECT SQL_NO_CACHE * FROM test.foo') or die(mysql_error());
mysql_query('SELECT SQL_NO_CACHE * FROM test.bar') or die(mysql_error());
?>
$ time ( for i in {1..100} ; do php 1.php; done;)

real    0m3.554s
user    0m2.300s
sys     0m1.188s
$ time ( for i in {1..100} ; do php 2.php; done;)

real    0m3.555s
user    0m2.292s
sys     0m1.208s

Я называю ерунду.

Возможно, ваш коллега путается с клиентом командной строки mysql, который будет загружать все имена таблиц и столбцов, если вы переключитесь на базу данных (чего можно избежать с помощью переключателя -A)?

0 голосов
/ 17 сентября 2010

Я очень сомневаюсь, что если вы добавите имя базы данных, это повлияет на производительность.

Постоянные соединения и рефакторинг ваших запросов, чтобы никогда, EVER select * был бы хорошим первым шагом, я думаю. Тогда вы можете подумать об использовании кэширования запросов и взглянуть на свой медленный журнал запросов. Это поможет вам больше, чем небольшое семантическое различие, например, указание имени схемы.

0 голосов
/ 17 сентября 2010

Я не знаю наверняка о вашем вопросе, но сомневаюсь, что это будет иметь существенное значение.

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

ex:

mysql_query('SELECT id, size, color FROM apples');

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

ex:

SELECT id, username, access_level FROM users WHERE id = ? LIMIT 1
...