Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Heloł. Od wczoraj bawię się w MTA językami bazodanowymi (czyli wbudowanymi SQLite i MySQL). Niby nauczyłem się już wykonywać podstawowe zapytania, ale jak widzę, SQLite jest ponad 10 razy wolniejsze przy wykonywaniu SELECT. Zastosowałem transakcje, które powinny być wszędzie dla tego języka (zastosowałem się do [url=https://katastrophos.net/andre/blog/2007/01/04/sqlite-performance-tuning-and-optimization-on-embedded-systems/]tego[/url] poradnika), wykonuję zapytania [b]250,000[/b] razy (!) i z tego co zauważyłem:
- - INSERT w SQLite działa o kilkanaście, czasem kilkaset milisekund szybciej (!)
- - SELECT w SQLite działa o ponad 10 razy wolniej
- Dla testów włączyłem też transakcje dla obu języków (tak mi polecił Tey) i właśnie od tego czasu zauważyłem, że SQLite się "krztusi". Czy da się to jakoś zoptymalizować?
- Dodam też tekst z logów, coby udowodnić, że rzeczywiście SQLite ma problem z wykonywaniem SELECT:
- [code][10] INFO: Czas wykonania pętli - 3917 milisekund.
- [10] INFO: Połączono z bazą danych.
- [10] INFO: Pomyślnie wypełniono tabelę w SQLite. Czas trwania to 3548 milisekund
- [10] INFO: Pomyślnie wypełniono tabelę w MySQL. Czas trwania to 3640 milisekund
- [10] INFO: Pomyślnie wybrano z tabeli. Czas trwania dla SQLite to 1678 milisekund
- [10] INFO: Pomyślnie wybrano z tabeli. Czas trwania dla MySQL to 182 milisekund[/code]
- A tutaj kod:
- [code]local MySQL_HOST = "HOST"
- local MySQL_USER = "USER"
- local MySQL_PASS = "PASS"
- local MySQL_DB = "DB"
- local MySQL_PORT = 3306
- local Connection = dbConnect("sqlite", "sqlite.db")
- local MySQLConnection = dbConnect("mysql", "dbname=" .. MySQL_DB .. ";host=" .. MySQL_HOST, MySQL_USER, MySQL_PASS, "share=1", "port=" .. MySQL_PORT)
- local TABELA = "TABELA"
- local Handler_DB = nil
- local Number = 250000
- addEventHandler("onResourceStart", resourceRoot, function()
- HandleQuery = dbQuery(Connection, "CREATE TABLE IF NOT EXISTS " .. TABELA .. " (Tekst TEXT, ID INTEGER);")
- MySQLQuery = dbQuery(MySQLConnection, "CREATE TABLE IF NOT EXISTS " .. TABELA .. " (Tekst TEXT, ID INT(2);")
- local Result = dbPoll(HandleQuery, -1) and dbFree(HandleQuery) and dbPoll(MySQLQuery, -1) and dbFree(MySQLQuery)
- local NOW = getTickCount()
- for i = 0, Number do
- print()
- end
- local TIME__ = getTickCount() - NOW
- outputDebugString("Czas wykonania pętli - " .. TIME__ .. " milisekund.", 3)
- if not Connection then
- outputDebugString("Brak połączenia z bazą danych SQLite.", 1)
- elseif not MySQLConnection then
- outputDebugString("Brak połączenia z bazą danych MySQL.", 1)
- else
- outputDebugString("Połączono z bazą danych.", 3)
- Fill_Table()
- Show_Table()
- end
- end)
- function Fill_Table()
- local NOW = getTickCount()
- SQLite_Query = dbQuery(Connection, "BEGIN TRANSACTION;")
- for i = 0, Number do
- SQLite_Query = dbQuery(Connection, "INSERT OR REPLACE INTO " .. TABELA .. " (Tekst, ID) VALUES (?, ?)", "Tekst nr" .. i, i)
- end
- SQLite_Query = dbQuery(Connection, "END TRANSACTION;")
- local Difference = getTickCount() - NOW
- outputDebugString("Pomyślnie wypełniono tabelę w SQLite. Czas trwania to " .. Difference .. " milisekund", 3)
- local NOW__ = getTickCount()
- MySQL_Query = dbQuery(MySQLConnection, "START TRANSACTION;")
- for i__ = 0, Number do
- MySQL_Query = dbQuery(Connection, "INSERT INTO " .. TABELA .. " (Tekst, ID) VALUES (?, ?)", "Tekst nr" .. i__, i__)
- end
- MySQL_Query = dbQuery(MySQLConnection, "COMMIT;")
- local Difference__ = getTickCount() - NOW__
- outputDebugString("Pomyślnie wypełniono tabelę w MySQL. Czas trwania to " .. Difference__ .. " milisekund", 3)
- end
- function Show_Table()
- local NOW = getTickCount()
- local QUERY__ = dbQuery(Connection, "BEGIN TRANSACTION;")
- local QUERY__ = dbQuery(Connection, "SELECT ID FROM " .. TABELA .. "")
- local QUERY__ = dbQuery(Connection, "END TRANSACTION;")
- local Result = dbPoll(QUERY__, -1) and dbFree(QUERY__)
- local Difference = getTickCount() - NOW
- outputDebugString("Pomyślnie wybrano z tabeli. Czas trwania dla SQLite to " .. Difference .. " milisekund", 3)
- local NOW__ = getTickCount()
- local QUERY____ = dbQuery(MySQLConnection, "START TRANSACTION")
- local QUERY____ = dbQuery(MySQLConnection, "SELECT ID FROM " .. TABELA)
- local QUERY____ = dbQuery(MySQLConnection, "COMMIT;")
- local Result = dbPoll(QUERY____, -1) and dbFree(QUERY____)
- local Difference__ = getTickCount() - NOW__
- outputDebugString("Pomyślnie wybrano z tabeli. Czas trwania dla MySQL to " .. Difference__ .. " milisekund", 3)
- end
- addCommandHandler("insert", Fill_Table)
- addCommandHandler("show", Show_Table)[/code]
- I teraz podstawowe pytanie - czy ja robię coś źle, czy może źle używam SQLite, czy po prostu samo SQLite nie daje sobie rady z taką liczbą zapytań?
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement