Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Запрос из таблицы INFORMATION_SCHEMA

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Dezmont
Отправлено: 05 Марта, 2012 - 17:34:52
Post Id



Частый гость


Покинул форум
Сообщений всего: 245
Дата рег-ции: Июль 2010  


Помог: 1 раз(а)




Подскажите пожалуйста, почему при выборке из information_schema у меня очень долго выполняется скрипт?

PHP:
скопировать код в буфер обмена
  1.  
  2. define('DB_HOST','localhost');
  3. define('DB_USER','root');
  4. define('DB_NAME','mydb');
  5. mysql_connect(DB_HOST,DB_USER) or die('Connection error: '.mysql_error());
  6. mysql_select_db(DB_NAME) or die('Failed to select database: '.mysql_error());
  7.  
  8. ########################################################################################
  9.  
  10. function draw_table(){
  11. // LABLE_1
  12.         $query = '
  13.         SELECT column_name,table_name,column_comment
  14.                 FROM information_schema.columns
  15.                 WHERE table_schema = \''.DB_NAME.'\' ORDER BY ORDINAL_POSITION
  16.         ';
  17.         $zapros = mysql_query($query) or die(mysql_error());
  18.         while($array = mysql_fetch_assoc($zapros)){
  19.                 $massiv[$array['table_name']][$array['column_name']] = $array['column_comment'];
  20.         }
  21. //LABLE_2
  22.         $query_2 = '
  23.         SELECT *
  24.                 FROM contragent LIMIT 1
  25.         ';
  26.         $zapros_2 = mysql_query($query_2) or die(mysql_error());
  27.         while($array_2 = mysql_fetch_assoc($zapros_2)){
  28.                 $massiv_2[] = $array_2;
  29.         }
  30.         $tablica = '<table><tr>';
  31.         for($i = 0; $i < mysql_num_fields($zapros_2); ++$i){
  32.                 $table = mysql_field_table($zapros_2,$i);
  33.                 $name = mysql_field_name($zapros_2,$i);
  34.         }
  35.         $tablica .= '</tr></table>';
  36.         echo $tablica;
  37. LABLE_3;
  38. }
  39. draw_table();
  40.  
  41.  


Среднее время выполнения скрипта 0.85 сек. Если убрать кусок кода c LABLE_1 до LABLE_2, то скрипт выполняется за 0,0025 сек.

В mysql.exe запрос $query занимает 0.09 сек. Возвращает он порядка 100 строк. Вроде не должно так долго работать, но я чёт даже не знаю куда копать. Подскажите пожалуйста.

(Отредактировано автором: 06 Марта, 2012 - 07:38:05)

 
 Top
Dezmont
Отправлено: 05 Марта, 2012 - 23:11:44
Post Id



Частый гость


Покинул форум
Сообщений всего: 245
Дата рег-ции: Июль 2010  


Помог: 1 раз(а)




Ап. Может кто-нибудь хотя бы даст пинок в верном направлении?
 
 Top
LIME
Отправлено: 06 Марта, 2012 - 00:38:08
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




хз...могу только построить глупое предположение что вы сначала mysql_select_db(DB_NAME)
тоесть mydb
а потом FROM information_schema.columns что является другой базой и таблицей
в тонкостях мучкула не селен но думаю требуется время на выяснения чего вы хотите
 
 Top
Dezmont
Отправлено: 06 Марта, 2012 - 07:46:12
Post Id



Частый гость


Покинул форум
Сообщений всего: 245
Дата рег-ции: Июль 2010  


Помог: 1 раз(а)




LIME, это не подходит. Убирал, пробовал, но ничего не меняется. MySQL вроде нормально понимает, когда при использовании оной БД обращаются к другой.

Закомментировал код от LABLE_2 до LABLE_3. При единичном вызове функции draw_table() времы выполнения около 0,09сек. Но при вызове 2 и более раз, сразу увеличивается до 0,85. Причём два вызова 0,85. 10 вызовов тоже 0,85. Может чть-чуть больше...=/

Я так думаю, что дело в самом PHP. В mysql.exe запросы выполняются с нормальной скоростью.
Есть ещё предположения?
 
 Top
EuGen Администратор
Отправлено: 06 Марта, 2012 - 08:22:34
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




CODE (SQL):
скопировать код в буфер обмена
  1. SHOW CREATE TABLE COLUMNS

->
CODE (SQL):
скопировать код в буфер обмена
  1. CREATE TEMPORARY TABLE `COLUMNS` (
  2.  `TABLE_CATALOG` varchar(512) DEFAULT NULL,
  3.  `TABLE_SCHEMA` varchar(64) NOT NULL DEFAULT '',
  4.  `TABLE_NAME` varchar(64) NOT NULL DEFAULT '',
  5.  `COLUMN_NAME` varchar(64) NOT NULL DEFAULT '',
  6.  `ORDINAL_POSITION` bigint(21) NOT NULL DEFAULT '0',
  7.  `COLUMN_DEFAULT` longtext,
  8.  `IS_NULLABLE` varchar(3) NOT NULL DEFAULT '',
  9.  `DATA_TYPE` varchar(64) NOT NULL DEFAULT '',
  10.  `CHARACTER_MAXIMUM_LENGTH` bigint(21) DEFAULT NULL,
  11.  `CHARACTER_OCTET_LENGTH` bigint(21) DEFAULT NULL,
  12.  `NUMERIC_PRECISION` bigint(21) DEFAULT NULL,
  13.  `NUMERIC_SCALE` bigint(21) DEFAULT NULL,
  14.  `CHARACTER_SET_NAME` varchar(64) DEFAULT NULL,
  15.  `COLLATION_NAME` varchar(64) DEFAULT NULL,
  16.  `COLUMN_TYPE` longtext NOT NULL,
  17.  `COLUMN_KEY` varchar(3) NOT NULL DEFAULT '',
  18.  `EXTRA` varchar(20) NOT NULL DEFAULT '',
  19.  `PRIVILEGES` varchar(80) NOT NULL DEFAULT '',
  20.  `COLUMN_COMMENT` varchar(255) NOT NULL DEFAULT ''
  21. ) ENGINE=MyISAM DEFAULT CHARSET=utf8

Стало быть:
CODE (SQL):
скопировать код в буфер обмена
  1. EXPLAIN SELECT column_name, table_name, column_comment
  2. FROM information_schema.COLUMNS
  3. WHERE table_schema = 'some_db'
  4. ORDER BY ORDINAL_POSITION

->
PHP:
скопировать код в буфер обмена
  1. +----+-------------+---------+------+---------------+------+---------+------+------+-----------------------------+
  2. | id | select_type | table   | type | possible_keys | key  | key_len | ref  | rows | Extra                       |
  3. +----+-------------+---------+------+---------------+------+---------+------+------+-----------------------------+
  4. |  1 | SIMPLE      | columns | ALL  | NULL          | NULL | NULL    | NULL |    2 | Using where; Using filesort |
  5. +----+-------------+---------+------+---------------+------+---------+------+------+-----------------------------+
  6.  


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


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Dezmont
Отправлено: 06 Марта, 2012 - 09:37:15
Post Id



Частый гость


Покинул форум
Сообщений всего: 245
Дата рег-ции: Июль 2010  


Помог: 1 раз(а)




EuGen, в mysql.exe показывает время выборки 0.06. Время выполнения куска LABLE_1 - LABLE_2 составляет 0.09 сек. Части LABLE_2 - LABLE_3 составляет 0.0025 сек. Так почему, даже при однократном вызове всей функции время выполнения становится равным 0,8 сек? Я проверял многократные SELECT запросы из разных таблиц, которые созданы мной, в них нормально. Адекватное время выполнения скрипта. А тут так сильно увеличивается.

Причём, если я меняю местами куски LABLE_1-LABLE_2 c LABLE_2_LABLE_3, то скрипт выполняется 0.09 сек.
PHP:
скопировать код в буфер обмена
  1. function draw_table(){
  2.  
  3.        
  4.         $query_2 = '
  5.         SELECT *
  6.                 FROM mydb.contragent LIMIT 1
  7.         ';
  8.         $zapros_2 = mysql_query($query_2) or die(mysql_error());
  9.         while($array_2 = mysql_fetch_assoc($zapros_2)){
  10.                 $massiv_2[] = $array_2;
  11.         }
  12.         $tablica = '<table><tr>';
  13.         for($i = 0; $i < mysql_num_fields($zapros_2); ++$i){
  14.                 $table = mysql_field_table($zapros_2,$i);
  15.                 $name = mysql_field_name($zapros_2,$i);
  16.                 $tablica .= '<td>'.$super[$table][$name].'</td>';
  17.         }
  18.         $tablica .= '</tr></table>';
  19.         echo $tablica;
  20.         $query = '
  21.         SELECT column_name,table_name,column_comment
  22.                 FROM information_schema.columns
  23.                 WHERE table_schema = \''.DB_NAME.'\' ORDER BY ORDINAL_POSITION
  24.         ';
  25.         $zapros = mysql_query($query) or die(mysql_error());
  26.         while($array = mysql_fetch_assoc($zapros)){
  27.                 $massiv[$array['table_name']][$array['column_name']] = $array['column_comment'];
  28.        
  29.         }
  30. }

Вот так 0.09 сек. В первом случае 0,8 сек.

Абсолютно любой запрос ПОСЛЕ следующего, в 5 раз увеличивает время выполнения скрипта.
PHP:
скопировать код в буфер обмена
  1. $query = '
  2.         SELECT column_name,table_name,column_comment
  3.                 FROM information_schema.columns
  4.                 WHERE table_schema = \''.DB_NAME.'\' ORDER BY ORDINAL_POSITION
  5.         ';
  6.         $zapros = mysql_query($query) or die(mysql_error());

Сам этот запрос увеличивает время выполнения на 0,09. Но это ещё терпимо. А вот 0.7-0.8 сек это уже очень долго...=(((

EuGen, может я чего-то не понял из вашего ответа. Подскажите как выкрутиться?

(Отредактировано автором: 06 Марта, 2012 - 09:45:56)

 
 Top
Dezmont
Отправлено: 07 Марта, 2012 - 11:01:21
Post Id



Частый гость


Покинул форум
Сообщений всего: 245
Дата рег-ции: Июль 2010  


Помог: 1 раз(а)




АП
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB