БД на файлах и MySQL -- скорость

lucas

Guest
БД на файлах и MySQL -- скорость

В настоящее время я занят переписыванием собственной CMS.

Обнаружил недавно весьма поразившую меня вещь:

1. В первой версии все данные у меня хранились в файлах такой структуры:
PHP:
<? $database[1] = array(" . . . "," . . . "," . . . ") ; ?>
Загружалась такая база так:
PHP:
$database = array() ;
include($path) ;
Обращался я к ней так:
1. Через считывание в переменную всего массива.
2. Через перебор массива и поиск нужного значения по ключу/подстроке.

2. Решил избавляться от извратов типа базы данных на файлах и поставил себе MySQL. Переписал систему, банально изменив класс интерфейса к базе данных.

Базы данных приобрели такую структуру:
PHP:
create table table_name(
id int unsigned not null primary key auto_increment
, time int unsigned not null
, is_visible enum('" . ok . "', '') not null default ''
, . . . tinytext
, . . . tinytext
)
Обращался я к ней так:
1. К всей:
PHP:
select * from table_name where is_visible = '" . ok . "'
2. К строке:
PHP:
select * from table_name where id = '" . $id . "' and is_visible = '" . ok . "'
При этом обнаружилась интересная вещь: время генерации страницы в первом случае составляет 0.06, во втором -- 0.13. (В обоих случаях кол-во запросов к базе составляет ~10; в первом случае применяется кеширование прочитанной базы.)

Тестирование проводил на Windows XP Prof. (FAT 32), Apache 1.3.12, PHP 4.3.0, MySQL 4.0.14b.
При этом код в версии 1 и версии 2 абсолютно идентичен, за исключением классы базы данных.

Хотелось бы узнать ваше мнение о результатах теста.
 

lucas

Guest
Создал на всех таблицах индексы по всем полям:
PHP:
alter table table_name add index(id, time, type(128), . . .)
Ситуация не изменилась.

При этом все таблицы (9 штук) содержат по 1-2 записи.

p.s. парашютики не забываем, не забываем...
?
 

Vasya

Guest
Не стоит тут ничего мерять.
Нечего тут мерять.
Кроме времени, которое занимает коннект к базе...

Если у тебя мало данных (18 записей), они редко меняются и они просты... тогда храни в файлах. БД тебе просто не нужна.
А вот если сайт у тебя более-менее динамичный и ... короче, когда тебе действительно понадобиться БД -- ты об этом узнаешь! :)

А в проекте такого масштаба -- не морочь себе голову!
 

tony2001

TeaM PHPClub
>alter table table_name add index(id, time, type(128), . . .)
читаем дальше ту же страницу.
выясняем разницу между составным индексом и несколькими индексами.
 

HabaHaba

Новичок
А вот я бы поменял эту строчку:
PHP:
select * from table_name where is_visible = '" . ok . "'
на
PHP:
select * from table_name where is_visible = 1
 

lucas

Guest
2Vasya

А вот если сайт у тебя более-менее динамичный и ... короче, когда тебе действительно понадобиться БД -- ты об этом узнаешь!
Не хотелось бы принимать решение о переходе на СУБД после падения сервера или тормозов при работе.

А в проекте такого масштаба -- не морочь себе голову!
Хотелось бы узнать, где я упоминал о масштабах проекта?
То, что в таблицах по нескольку записей -- от того, что система в разработке, а не от того, что она по определению недоразвита.

2tony2001

читаем дальше ту же страницу.
выясняем разницу между составным индексом и несколькими индексами.
Понятно. Спасибо.

2HabaHaba

А вот я бы поменял эту строчку
Данная строка в нынешнем виде не отвечает каким-то неизвестным мне критериям?
 

tony2001

TeaM PHPClub
>Данная строка в нынешнем виде не отвечает каким-то неизвестным мне критериям?
да, поиск по строке будет происходить по определению менее быстро, чем по INTу.
 

HabaHaba

Новичок
Данная строка в нынешнем виде не отвечает каким-то неизвестным мне критериям?
Да нет, я сначала не заметил, что поле enum -- подумал, что варчар.
Хотя, лично мне, привычней "флажки" делать тиниинтом: 0 = нет, 1 = да. Но это дело вкуса, так как разницы в скорости не заметно.
 

lucas

Guest
Даже если поле определено как множество из двух возможных значений?
PHP:
enum('" . ok . "', '')
2HabaHaba & tony2001
Вопрс снят.
 

Demiurg

Guest
получается что тип поля зависит от константы в срипте ? не хорошо.
 

lucas

Guest
И еще:

Приведенная выше схема устройства базы данных на файлах оптимальна? Какие улучшения (прежде всего по скорости) можно сделать?

Имеется в виду:

PHP:
<? $database[1] = array(" . . . "," . . . "," . . . ") ; ?>
PHP:
$database = array() ;
include($path) ;
 
Сверху