Я предположил, что SQLite нужен скорее для мелких вещей, типа счетчика посещений. Для тех кто не хочет сервер ставить. Поэтому и тестировал на запись. Сейчас протестирую на чтение и добавлю.
неужто кто-то возлагал на SQLite большие надежды?
он создан не для крупных проектов, а для мелких. там, где не хотелось бы ставить большие библиотеки для работы с нормальными базами. я так думаю.
абсолютно. SQLite достаточно неоптимально работает с хранилищем под Win/WinCE. под WinCE вообще много проблем. без продолжительного патчинга заставить его работать нормально — невозможно. а контрибуции как-то странно они рассматривают.
Судя по минусам, меня не поняли.
Смотрите ниже тест от юзера ptalus, по которому ясно видно, что sqlite работает в ubuntu 60% от скорости mysql, а в статье (уверен что windows) только 6% от mysql. Имхо тормоза из-за открытия/закрытия файла.
Получается что sqlite (без BEGIN/COMMIT) на ubuntu работает в 10 раз быстрей, чем на windows. А в статье об этом и о платформе не слова.
я не знаток линукса и не возьмусь утверждать что дело только в ОСи. напишите свое исследование на эту тему) только осторожнее с холиварными заголовками. вообще как я понимаю сравнение винды и линукса тут на хабре больная тема, так же как эппл, гугл и тема.
странный результат. Запустил ваш тест на своем dev сервере (Ubuntu Server, ядро 2.6, Apache 2, PHP 5.2.6) и получил тот результат на который, как я понял, вы надеялись:
SQLite:
0.0226039886475
0.0238060951233
0.0236310958862
0.015144109726
0.0120120048523
Average time:
0.019439458847
MySQL:
0.0117030143738
0.011342048645
0.0117700099945
0.0126521587372
0.0117499828339
Average time:
0.0118434429169
Количество итераций увеличено до 500:
SQLite
…
Average time:
0.0125000824928
Весьма показательно, что результаты работы с файловой системой MySQL несильно зависят от ОС (я писал свою базу данных с поддержкой индексирования, которая хранит все данные в 4х файлах, и MySQL везде (и Windows и MacOS X) работает намного шустрее и на вставку и на выборку данных :))
Совершенно нелепое сравнение. MS Access по всем тестам отстает. Я прошу прощение за неподтвержденное выкладками заявление, но тесты в нашей компании проводились. На порядок быстрее оказывается SQLite. Да и архитектура совершенно разная. Все разное. Сравнивать SQLite Vs MS Access, имхо, просто нельзя.
Я не предлагаю сравнивать именно с ним. Я имею ввиду, что надо сравнивать SQLite с соответствуемой БД, но не с MySQL/PostgreSQL/Oracle. ms access случайно подвернулся.
RTFM: www.sqlite.org/speed.html
там пишут, что SQLite вынужден открывать/закрывать файл базы данных при выполнении каждой транзакции, т. е. в вашем тесте в каждой итерации. Однако если выполнять все итерации в одной транзакции, то он оказывается быстрее MySQL (все выполняется в Ubuntu Server)
SQLite:
Average time:
0.00223562335968
Основное отличие InnoDB от MyISAM в том, что блокировка в нем идет на уровне записи, а не на уровне таблицы, как в MyISAM. Запись заметно ускоряется. Но вот для чтения MyISAM предпочтительнее.
Реальный результат на продакшене будет другой. У вас с базой 1 пользователь работает?
Т. к. у sqlite один файл на все таблицы, то при записи будет блокировка ВСЕЙ базы, и во время параллельных запросов на запись отставание sqlite будет очевидным. У MySQL блокировка может быть на уровне таблиц или строк.
прочтите первое сообщение нашей ветки, там шла речь об одновременных обращениях к базе данных, мой вариант очень даже подходит, ненадо тут из себя строить умника.
Ну хоть кто-то указал на проблемы SQLite при конкурентном доступе.
Только причины не в том, что вся БД в одном файле (в InnoDB несколько БД могут храниться в одном файле). SQLite это встраиваемый сервер, у которого нет выделенного процесса для доступа к файлам БД, поэтому блокировку вожможно осуществлять только на уровне файлов.
сиквела, как торговой марки компании Oracle, нет годов так с 70-х. Оказалось, что это чья-то чужая торговая марка. Но осталось прочтение sql как sequel.
Резюмируя вышесказанное в комментариях: SQLite всем хорош при малом количестве пользователей (=одновременных транзакций) и не слишком сложной структуре БД. А в общем очень милая и полезная в своей нише вещь. Когда нужно просто удобно сохранить некоторый структурированный набор данных — самое оно.
Но таки есть ситуации, когда поднимать MySQL нецелесообразно. В первую очередь это касается фактически stand-alone приложений, хотя PHP тут уже ни при чём (пока :-)).
В общем, когда есть возможность «MySQL поставить и забыть» — лучше так и сделать. А вот когда её нет — поможет SQLite ))
А какой смысл делать цикл запросов внутри транзакции, у вас для задачи «простой счётчик посещений» при каждом посещении в базу пишется 500 строк? :) Конечно, для общей оценки это полезное дело, но в таком случае результат у вас получился не адекватен поставленной задаче, уж извините :)
в скором времени попробую опровергнуть или подтвердить ваше утверждение) есть база GeoIP, там порядка 7,7 тысяч записей. Вот и посмотрим где проще, быстрее и лучше)
Конечно, но когда у меня молоток и киянка и я не уверен что лучше подойдет в какой-либо ситуации — я пробую постучать одним и другим. Потом пишу про результаты и показываю остальным) И тогда народ решает что кому где надо
Изначально я хотел узнать почему SQLite так тупит на запись. Узнал. Теперь вывод я считаю в том, чтобы переубедить тех, кто отказывался от SQLite потому что он протестировал так же, как и я сначала и отказался от него.
К сожалению SQLite действительно хорош только в качестве встраиваемой БД в однопользовательское приложение. В своё время я решил его попробовать на локальном веб-ресурсе. Сейчас это вылилось в то, что даже несмотря на совсем простые запросы, при среднем количестве пользователей в 500-800 в сутки загруженность процессора близка к 100%.
Тормозной SQLite? Совсем нет!