пятница, 18 января 2019 г.

WinBinder. Создание форм

WinBinder. Создание форм

Автор: Притолюк Максим (f0rm4t@satka.ru)
Смотрите также: Знакомство с WinBinder
Единственное назначение библиотеки WinBinder – создание GUI-форм для Windows.
Любое окно, будь оно родительским или всплывающим, создается функцией wb_create_window. Она находится в самой библиотеке. Чтобы использовать эту функцию, необходимо подключить к проекту файл winbinder.php, который находится в каталоге phpcode/include.
Синтаксис функции таков:

int wb_create_window (int parent, int wclass, string [caption], int [xpos], int [ypos], int [width], int [height], int [style], int [param]);

Первый параметр – parent - имя окна родителя. Если создается главное окно, то должно быть пустым, то есть NULL.

Второй – wclass – класс окна. Вот список доступных значений:
ResizableWindow - простое окно;
AppWindow – окно определенного размера;
NakedWindow – окно определенного размера, без рамки и заголовка;
ModalDialog – всплывающее окно, блокирующее работу программы до его закрытия;
ModelessDialog – простое всплывающее окно;
PopupWindow – еще одно простое всплывающее окно;
ToolDialog – всплывающее окно с маленьким заголовком.
Затем идет заголовок окна, позиция по горизонтали, позиция по вертикали, ширина, высота, стиль окна и его параметры.

Для позиционирования окна по центру можно использовать константу WBC_CENTER. Список всех доступных констант приведен в официальном мануале или на сайте разработчиков библиотеки по адресу http://winbinder.org/manual/reference/constants.html.

Ниже находится исходный код пустой формы.

<?phpinclude "E:/WB/phpcode/include/winbinder.php"wb_create_window (NULLAppWindow"Пустая форма"380280); wb_main_loop ();?>

В этом примере, кроме функции wb_create_window (), есть еще одна - wb_main_loop ().
Она заставляет программу постоянно находиться в памяти, и не выгружаться до тех пор, пока не будет вызвана функцияwb_destroy_window (). Здесь не обрабатываются никакие события, поэтому функция wb_destroy_window () не используется. Но если вы хотите использовать какие-нибудь компоненты, и хотите, чтобы они выполняли какие-либо действия, то должны создать функцию обработки событий.

Например:

<?phpinclude "E:/WB/phpcode/include/winbinder.php"$mainwin wb_create_window (NULLAppWindow"Пустая форма"380280); wb_create_control ($mainwinPushButton"Click Me"1010100251); wb_set_handler($mainwin"process_main"); wb_main_loop ();
function 
process_main($window$id){

switch(
$id) {

case 
1:wb_message_box ($window"Сегодня ".date("d M Y")." года""Message Box"WBC_OK);

break;
case 
IDCLOSE:wb_destroy_window($window);

break;

}

}
?>

int wb_create_control (int parent, int ctlclass , mixed [caption], int [xpos], int [ypos], int [width], int [height], int [id], int [style], int [param], int [ntab]);

Функция wb_create_control создает на окне [parent] компонент [ctlclass], с заголовком или текстом [caption], с отступом от левого края [xpos] и от правого края [ypos], с шириной [width] и высотой [height], ID которого равен [id].
Подробнее в мануале по адресу http://winbinder.org/manual/functions/wb_create_control.html.

Обратите особое внимание на функцию wb_set_handler ().

int wb_set_handler (int window, string fn_handler);

Она связывает окно [window] c функцией-обработчиком событий [fn_handler].

Рекомендую посмотреть официальный мануал. Он содержит описание все доступных функций. К сожалению, он доступен только на английском языке и не содержит описания констант.

четверг, 17 января 2019 г.

Конвертация баз MySQL в dBase

Конвертация баз MySQL в dBase

Автор: Алимов Рустем
Во многих предприятиях, разместивших свои ресурсы в интернете, осталось большое количество программных комплексов и различных скриптов, работающих с данными в формате dBase. Появилась задача обратной совместимости.
Данный класс поможет Вам преобразовывать базы данных MySQL в dBase.
Для работы этого скрипта необходимо, чтобы PHP был скомпилирован с поддержкой dBase. Чтобы узнать это, достаточно вызвать функцию phpinfo(). Если в строке Configure Command сведений о версии PHP есть параметр --enable-dbase, значит Ваша версия поддерживает dBase (можно также посмотреть в разделе Additional Modules наличие строки dBase).
<? PHP
класс ConvdBase
{
var $conv_dir; // каталог конвертации - здесь будут DBF-файлы
var $struct; // структура текущей таблицы,
// используется при конвертации данных
функция ConvdBase ($ dir)
{
$ This-> setoutdir ($ реж);
}
// имя поля и его тип формата MySQL преобразуем к dBase
// например: code int(10), преобразуем к array('code', 'N', 10, 0)
// если $mysql == true, то возвращаем только тип int
// который записывается в $this->struct
Функция getfield ($ f_name, $ f_type, $ mysql = false)
{
$ len = 0;
$ min = 0;
$ pos = strpos ($ f_type, '(');
если ($ поз)
{
$ type = strtolower (substr ($ f_type, 0, $ pos));
sscanf (substr ($ f_type, $ pos), '(% d,% d)', & $ len, & $ perc);
}
еще
$ type = strtolower ($ f_type);
если ($ MySQL)
вернуть тип $;
Переключатель ($ типа)
{
case 'double': case 'float':
$ len = 19; $ min = 3;
$ type = 'N';
перерыв;
case 'enum':
$ len = 5;
case 'int': case 'tinyint': case 'smallint':
if (! $ len)
$ len = 19;
$ min = 0;
// break не нужен
регистр 'десятичный':
$ type = 'N';
перерыв;
case 'tinytext': case 'text': case 'longtext':
case 'varchar': case 'char':
if (! $ len || $ len> 254)
$ len = 254;
$ type = 'C';
перерыв;
case 'year': case 'datetime': case 'timestamp':
$ len = $ min = 0;
$ type = 'D';
перерыв;
}
$ field = array ($ f_name, $ type, $ len, $ perc);
вернуть поле $;
}
// установка исходящего каталога
функция setoutdir ($ dir)
{
$ this-> conv_dir = $ dir;
@mkdir ($ this-> conv_dir, 0777);
}
// конвертация данных
функция convertdata ($ row)
{
$ data = array ();
для ($ i = 0; $ i <sizeof ($ this-> struct); $ i ++)
{
Переключатель ($ this-> структура [$ я])
{
case 'year': case 'datetime': case 'timestamp':
$ data [] = substr ($ row [$ i], 0, 8);
перерыв;
case 'tinytext': case 'text': case 'longtext':
case 'varchar': case 'char':
if (strlen ($ row [$ i])> 254)
{
$ data [] = substr ($ row [$ i], 0, 254);
перерыв;
}
// break не нужен
case 'smallint': case 'double': case 'float': case 'enum':
case 'int': case 'tinyint': case 'decimal': case 'int':
$ data [] = $ row [$ i];
перерыв;
}
}
вернуть данные $;
}
// конвертируем базу
функция преобразования ($ сервер, $ пользователь, $ пароль, $ db_name)
{
// отключить тайм-аут
if (! get_cfg_var ('safe_mode'))
set_time_limit (0);
$ link = mysql_connect ($ server, $ user, $ password);
если (! $ ссылка)
выход («Ошибка подключения»);
mysql_select_db ($ db_name);
$ tables_query = mysql_query ('SHOW TABLES', $ link);
$tek_table = 0; // порядковый номер таблицы - если обязательно
// требуется имя файла не более 8 символов
while ($ tables = mysql_fetch_array ($ tables_query, MYSQL_NUM))
{
$ table = $ tables [0];
$ field_array = array ();
$ this-> struct = array ();
// создаем структуру таблицы
$ fields_query = mysql_query ('ПОКАЗАТЬ ПОЛЯ ИЗ'. $ таблица);
$ tek_field = 0;
while ($ field = mysql_fetch_array ($ fields_query, MYSQL_ASSOC))
{
$ f_name = $ field ['Field'];
// имена полей dBase не должны быть более 10 символов
if (strlen ($ f_name)> 10)
$ f_name = sprintf ('% s% 03d', substr ($ f_name, 0, 7), sizeof ($ field_array) + 1);
$ field_array [] = $ this-> getfield ($ f_name, $ field ['Type']);
$ this-> struct [] = $ this-> getfield ($ tek_field, $ field ['Type'], true);
}
if(strlen($table) > 8) // см.выше о именах таблиц более 8 символов
$ table_name = sprintf ('% s% 03d', substr ($ table, 0, 5), $ tek_table ++);
еще
$ table_name = $ table;
$ base = dbase_create ($ this-> conv_dir. '/'. $ table_name. '.DBF', $ field_array);
если ($ основание)
{
// таблица создана - перекидываем данные
$ row_query = mysql_query ("SELECT * FROM". $ table);
while ($ row = mysql_fetch_array ($ row_query, MYSQL_NUM))
{
$ row = $ this-> convertdata ($ row);
если ($ строка)
if (! dbase_add_record ($ base, $ row))
выход («Ошибка добавления записи»);
}
dbase_close ($ основание);
}
}
mysql_close ($ ссылка);
}
}
?>
А теперь рассмотрим пример использования конвертатора.
$dir = './CONVERT_' . date('YmdHi'); // здесь будут DBF
$ conv = новая ConvdBase ($ dir);
$ conv-> convert ('localhost', 'user', 'pass', 'base');
Если типы данных year, datetime, timestamp надо передавать в неизменном виде, приведите их к типу dBase "С", изменив функции getfield и convertdata.

Хороший стиль программирования

Хороший стиль программирования

Автор: Симдянов И.В.
Источник: softtime.ru
Всякий кто сталкивается c PHP, в скором времени приходит к выводу, что это не совсем удобный язык для изучения. Дело в том, что он достаточно новый и динамично развивающийся, каждая последующая версия буквально перечёркивает предыдущую. В таких условиях имеющаяся документация быстро устаревает, а специалисты предпочитают не писать книг, так как информация размещённая в книге начинает устаревать до выхода книги в свет.
Почему же PHP так популярен и каким образом столько человек разом обучилось PHP? Дело в том, что большинство PHP-программистов не изучало язык с нуля, а изучало его либо уже зная С/С++, либо Perl. Perl является C-подобным языком программирования (как и PHP), а является предшественником PHP, можно сказать что PHP это Web-ориентированный Perl. Поскольку, PHP просто логически следует из Perl и широкое распространение получил именно из-за того, что программистам было легко переходить с Perl на PHP (ну и с С на PHP, тоже).

Замечание

Язык Perl появился в 1986 году по воле системного программиста Лари Уолла. Созданный первоначально как средство обработки текстовых файлов, призванное облегчить жизнь системному администратору UNIX, он превратился в настоящий язык программирования. Традиционные области, в которых Perl применяется особенно часто и успешно, — создание приложений CGI, системное администрирование UNIX, обработка текста.
Кроме того, свой вклад вносит предметная область — программирование для сети Интернет. Для серьёзного понимания которого желательно знание очень многих вещей (HTML, SQL, UNIX, прикладных протоколов — хотя бы HTTP, стилей программирования на С, Perl, Java).
Когда большинство PHP-программистов переходят в мир PHP с багажом другого языка программирования (их стиль уже устоялся), спрос на литературу, в которой бы обсуждались азы программирования не так велик. Новичкам бывает трудно найти информацию об организации кода. Мы надеемся, что эта статья поможет поставить свой собственный стиль, что в конечном итоге может увеличить скорость разработки на 30% и помочь при работе в команде, когда ваш код будет читаться другими программистами, а вам соответственно придётся читать чужой код.

Расстановка фигурных скобок и отступы

Существует несколько стилей расстановки фигурных скобок, все они диктуются существующими стилями в других C-подобных языках программирования.
1) Рациональный стиль
Это один из наиболее распространенных стилей, так как им пользовались Керниген (Kernighan) и Ричи (Ritchie), авторы языка C.
<?php
  
if($flag){
    echo 
"Hello world!";
  } 
?>
Преимущество этого подхода заключается в экономии вертикального пространства, жизненно важного при отладке большого блока кода. Оборотной стороной такого подхода является то, что может оказаться трудным найти символ {, спрятанный в конце строки. Этого стиля придерживаются и Java-программисты, как-то приписывает Sun.
2) Стиль Алмена
Эрик Алемен (Eric Allman) написал утилиты BSD в этом стиле, поэтому этот стиль часто называют "стиль BSD":
<?php
  
if($flag)
  {
    echo 
"Hello world!";
  } 
?>
Аргументом в поддержку такого стиля является тот факт, что область видимости блочного оператора ясна и визуально ассоциируется с управляющим оператором.
3) Стиль Whitesmith
Данный стиль предписывает использование следующей расстановки фигурных скобок
<?php
  
if($flag)
    {
    echo 
"Hello world!";
    } 
?>
Этот стиль имеет преимущество в том, что скобки более тесно ассоциируются с кодом, который они включают и разграничивают, однако при визуальном просмотре текста отыскать скобки оказывается чуть более сложно.
4) Стиль GNU
Программисты GNU фонда Free Software Foundation используют следующий стиль расстановки фигурных скобок
<?php
  
if($flag)
    {
      echo 
"Hello world!";
    } 
?>
Внутри любых управляющих конструкций операторы следует располагать с отступом на одинаковое число пробелов, например для операторов if-then-else код должен выглядеть следующим образом:
<?php
  $flag 
true;
  if(
$flag)
  {
    echo 
"Переменная равна true";
    exit();
  }
  else
  {
    echo 
"Переменная равна false";
    exit();
  } 
?>
Число может быть любым, обычно используют 2, 4 или 8 пробелов. Старайтесь придерживаться этого правила, некоторые программисты приходят в бешенство когда это число не кратно 2 :) Наиболее оптимальным является использование 2 пробелов, так как при их большем числе вложенные блоки становятся "растянутыми" и их становится сложно воспринимать.

Пробелы вокруг символов

Бинарные операторы следует обрамлять пробелами:
<?php
  
// Неправильно
  
$a=$b+$c*$d;
  
// Правильно
  
$a $b $c $d?>
Символ пробела ассоциируется с новым словом, поэтому формула читается не как непонятный набор символов, а как нечто осмысленное.

Комментарии

Расставляйте комментарии по принципу “чем больше, тем лучше” — пройдёт некоторое время и вы забудете, что делал тот или иной программный блок. Вообще принято комментировать код на английском языке или не комментировать вообще, так как в русском дикое количество кодировок, да и вообще так исторически сложилось. Плюйте на это, код вы комментируете в первую очередь для себя, а не для других! А раз уж вы делает это для себя делайте это в удобной для вас кодировке.
PHP собрал в себе практически все комментарии современных языков программирования, наряду с однострочными комментариями в стиле shell-скриптов (#)
<?php
  
# Программный модуль index.php
  
echo "Hello world!"?>
и С++ (//)
<?php
  
// Программный модуль index.php
  
echo "Hello world!"?>
можно использовать многострочный комментарий в стиле C:
<?php
  
/* Это многострочный комментарий в стиле С
     он охватывает несколько строк – не допускается
     вложенных комментариев
  */
  
echo "Hello world!"?>
К хорошему тону относится использование однострочных комментариев для короткого комментария, а многострочного — для комментария, охватывающего несколько строк. Не возбраняется использовать однострочные комментарии для большого текста, особенно в начале файла или важного блока кода
<?php
  
////////////////////////////////////////////////////////////////////////////////////////
  // Гостевая книга
  /////////////////////////////////////////////////////////////////////////////////////// 
?>
Как и при работе с отступами и фигурными скобками, основным требованием является необходимость придерживаться одного стиля во всех программных блоках.
При расстановке однострочных комментариев возможно два варианта: непосредственно перед выполняемым оператором
<?php
  
// Вывод текстовой строки в окно браузера
  
echo "Hello world!"?>
и после точки с запятой
<?php
    
echo "Hello world!"// Вывод текстовой строки в окно браузера ?>
Лучше придерживаться первого правила, так как строка получается длинной и плохо воспринимается читающим. Единственным оправданием использования такого комментария является комментирование закрывающейся скобки длинного программного блока, содержащего много вложенных блоков.
<?php
  
if($tot)
  {
     while(
$position next($tot))
     {
        
/* Очень длинный код
           содержащий много
           вложенных блоков
           ...
        */
        
if($flag)
        {
          echo 
"Ошибка";
          exit();
        }
     } 
// Конец while($position = next($tot))
  
?>

Имена переменных и функций

Существует несколько стилей названия переменных
$var_bell — стиль C: нижний регистр, знак подчёркивания.
$VarBell — стиль Pascal: каждая подстрока в названии начинается с большой буквы.
$varBell — стиль Java: первая строка начинается с маленькой буквы, все последующие с большой.
Не имеет значения, какой стиль будет вами выбран — главное придерживаться в коде одного стиля.

Замечание

В программировании константы традиционно записываются в верхнем регистре YANDEX_BOT. Если вы хотите, чтобы другие программисты могли легко воспринимать ваш код, придерживайтесь этого правила.
При названии переменных и функций старайтесь давать им осмысленные имена. Иногда ничего не приходит в голову, и появляется назвать переменную как попало — остерегайтесь этого. В своё время было потрачено не мало часов из-за неудачно названных переменных, иногда отладить код удавалось лишь в том случае, если переменные были переименованы подобающим образом.
Рассмотрим несколько примеров. Часто временные строки для хранения SQL называют $query (запрос) — это очень удачное название, ассоциирующееся именно с SQL-запросом. Обычно на этом всё и заканчивается. При появлении второго запроса, вторая переменная получает имя $query1 — это порочная практика. Обычно запросы в рамках одного скрипта отличаются своим действием: один SQL-запрос может выполнять обновление (UPDATE), другой выборку (SELECT), поэтому переменные лучше называть с указанием действия оператора: $query_update и $query_select, соответственно.
Часто можно увидеть код
<?php
  $query 
"SELECT * FROM catalog";
  
$query1 mysql_query($query);
  while(
$result mysql_fetch_array($query1))
  {
     
/* Код обработки */
  
?>
Здесь дескриптор запроса, возвращаемый функцией mysql_query() назван $query1, это здорово запутывает как разработчика, так и читающего текст программы. Дескриптор не несёт физического смысла — это лишь ключ к результату, поэтому его лучше называть сокращённым именем таблицы

<?php
  $query 
"SELECT * FROM catalog";
  
$cat mysql_query($query);
  while(
$catalog mysql_fetch_array($cat))
  {
     
/* Код обработки */
  
?>

среда, 16 января 2019 г.

Оптимальное использование MySQL

Оптимальное использование MySQL


Введение
В процессе предоставления услуг хостинга мы обращаем внимание на наиболее часто встречающиеся ошибки, которые совершают пользователи при разработке своих виртуальных серверов. Одним из "тяжелых" мест для типичного веб-мастера является работа с MySQL-сервером. Обычно изучение принципов функционирования SQL и методов работы с базами данных ведется по литературе, из которой выбираются только актуальные на момент чтения вещи - как соединиться с базой, как сделать запрос, как обновить информацию или добавить новую запись в базу данных и так далее.
Такой подход, конечно, дает желаемый результат - интерфейсы веб-сайта пользователя в итоге оказываются интегрированными с базой данных. Однако не всегда пользователи задумываются о том, насколько оптимально работает их база, как можно оптимизировать происходящие при работе с MySQL процессы и каково будет функционирование виртуального сервера при увеличившейся нагрузке, "наплывах" пользователей в результате, например, "раскрутки" сайта.
Эта статья поможет Вам оптимизировать работу с СУБД MySQL. Изложенный материал не претендует на детальное описание оптимизации MySQL вообще, а лишь обращает внимание на наиболее часто совершаемые пользователями ошибки и рассказывает о том, как их избежать. Более подробно узнать о тонкостях настройки MySQL можно на специализированных страницах, ссылки на которые приведены в конце этой статьи.
Какие данные нужно хранить в MySQL
Не старайтесь поместить в базы данных всю информацию, которая у Вас есть. Например, не нужно хранить там картинки, хоть MySQL это и позволяет. Помещая в базу данных двоичные образы графических файлов, Вы только замедлите работу своего сервера. Прочитать файл с картинкой с диска гораздо проще и, с точки зрения потребляемых ресурсов, экономичнее, нежели соединиться из скрипта к SQL, сделать запрос, получить образ, обработать его и, выдав нужные http-заголовки, показать посетителю веб-сервера. Во втором случае операция выдачи картинки потребует в несколько раз больше ресурсов процессора, памяти и диска. Также стоит помнить о том, что существуют механизмы кэширования веб-документов, которые позволяют пользователю экономить на трафике, а при динамической генерации контента Вы фактически лишаете своих посетителей этой удобной возможности.
Вместо картинок лучше хранить в MySQL информацию, на основе которой можно генерировать ссылки на статические картинки в динамически создаваемых скриптами документах.
Оптимизация запросов
В ситуациях, когда реально требуется получить только определенную порцию данных из MySQL, можно использовать ключ LIMIT для функции SELECT. Это полезно, когда, например, нужно показать результаты поиска чего-либо в базе данных. Допустим, в базе есть список товаров, которые предлагает Ваш интернет-магазин. Выдавать весь список товаров в нужной категории несколько негуманно по отношению к пользователю - каналы связи с интернет не у всех быстрые и выдача лишних ста килобайт информации зачастую заставляет пользователей провести не одну минуту в ожидании результатов загрузки страницы. В таких ситуациях информацию выдают порциями по, допустим, 10 позиций. Неправильно делать выборку из базы всей информации и фильтрацию вывода скриптом. Гораздо оптимальнее будет сделать запрос вида
выберите товар, цена книги ограничена 20,10
В результате, MySQL "отдаст" Вам 10 записей из базы начиная с 20-й позиции. Выдав результат пользователю, сделайте ссылки "Следующие 10 товаров", в качестве параметра передав скрипту следующую позицию, с которой будет делаться вывод списка товаров, и используйте это число при генерации запроса к MySQL.
Также следует помнить, что при составлении запросов к базе данных (SQL queries) следует запрашивать только ту информацию, которая Вам реально нужна. Например, если в базе 10 полей, а в данный момент реально требуется получить только два из них, вместо запроса
выберите * из таблицы
используйте конструкцию вида
выберите field1, field2 из table_name
Таким образом, Вы не будете нагружать MySQL ненужной работой, занимать лишнюю память и совершать дополнительные дисковые операции.
Также следует использовать ключ WHERE там, где нужно получать информацию, попадающую под определенный шаблон. Например, если нужно получить из базы поля с названиями книг, автором которых является Иванов, следует использовать конструкцию вида
выберите название из книг, где author = 'Иванов'
Также есть ключ LIKE, который позволяет искать поля, значения которых "похожи" на заданный шаблон :
выберите название из книг, где автор любит 'Иванов%'
В данном случае MySQL выдаст названия книг, значения поля author у которых начинаются с 'Иванов'.
Ресурсоемкие операции
Вместе с тем следует помнить, что существуют операции, выполнение которых само по себе требует больших ресурсов, чем для обычных запросов. Например, использование операции DISTINCT к функции SELECT вызывает потребление гораздо большего количества процессорного времени, чем обычный SELECT. DISTINCT пытается искать уникальные значения, зачастую производя множество сравнений, подстановок и расчетов. Причем, чем больше становится объем данных, к которому применяется DISTINCT (ведь Ваша база со временем растет), тем медленее будет выполняться такой запрос и рост ресурсов, требуемых для выполнения такой функции, будет происходить не прямо пропорцонально объему хранимых и обрабатываемых данных, а гораздо быстрее.
Индексы
Индексы используют для более быстрого поиска по значению одного из полей. Если индекс не создается, то MySQL осуществляет последовательный просмотр всех полей с самой первой записи до самой последней, осуществляя сопоставление выбранного значения с исходным. Чем больше таблица и чем больше в ней полей, тем дольше осуществляется выборка. Если же у данной таблицы существует индекс для рассматриваемого столбца, то MySQL сможет сделать быстрое позиционирование к физическому расположению данных без необходимости осуществлять полный просмотр таблицы. Например, если таблица состоит из 1000 строк, то скорость поиска будет как минимум в 100 раз быстрее. Эта скорость будет еще выше, если есть необходимость обратиться сразу ко всем 1000 столбцам, т.к. в этом случае не происходит затрат времени на позиционирование жесткого диска.
В каких ситуациях создание индекса целесообразно:
  1. Быстрый поиск строк при использовании конструкции WHERE
  2. Поиск строк из других таблиц при выполнении объединения
  3. Поиск значения MIN() или MAX() для проиндексированного поля
  4. Сортировка или группировка таблицы в случае, если используется проиндексированное поле
  5. В некоторых случаях полностью теряется необходимость обращаться к файлу данных. Если все используемые поля для некоторой таблицы цифровые и формируют левосторонний индекс для некоторого ключа, то значения могут быть возвращены полностью из индексного дерева с намного большей скоростью
  6. Если выполняются запросы вида
SELECT * FROM tbl_name WHERE col1 = val1 И col2 = val2;
и существует смешанный индекс для полей col1 и col2, то данные будут возвращены напрямую. Если же созданы отдельные индексы для col1 и для col2, то оптимизатор попробует найти наиболее ограниченный индекс путем определения того, какой из индексов может найти меньше строк, и будет использовать этот индекс для получения данных.
Если у таблицы есть смешанный индекс, то будет использоваться любое левостороннее совпадение с существующим индексом. Например, если есть смешанный индекс 3-х полей (col1, col2, col3), то индексный поиск можно осуществлять по полям (col1), (col1, col2) и (col1, col2, col3).
Поддержка соединения
Как Вы наверняка знаете, для работы с MySQL-сервером необходимо предварительно установить с ним соединение, предъявив логин и пароль. Процесс установки соединения может продолжаться гораздо большее время, нежели непосредственная обработка запроса к базе после установки соединения. Следуя логике, надо избегать лишних соединений к базе, не отсоединяясь от нее там, где это можно сделать, если в дальнейшем планируется продолжить работу с SQL-сервером. Например, если Ваш скрипт установил соединение к базе, сделал выборку данных для анализа, не нужно закрывать соединение к базе, если в процессе работы этого же скрипта Вы планируете результаты анализа поместить в базу.
Также можно поддерживать так называемое persistent (постоянное) соединение к базе, но это возможно в полном объеме при использовании более сложных сред программирования, чем php или perl в обычном CGI-режиме, когда интерпретатор соответствующего языка разово запускается веб-сервером для выполнения пришедшего запроса.