Advertisement
Shiny_

Untitled

Jul 4th, 2014
341
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 4.94 KB | None | 0 0
  1. 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:
  2. - INSERT w SQLite działa o kilkanaście, czasem kilkaset milisekund szybciej (!)
  3. - SELECT w SQLite działa o ponad 10 razy wolniej
  4.  
  5. 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ć?
  6.  
  7. Dodam też tekst z logów, coby udowodnić, że rzeczywiście SQLite ma problem z wykonywaniem SELECT:
  8. [code][10] INFO: Czas wykonania pętli - 3917 milisekund.
  9. [10] INFO: Połączono z bazą danych.
  10. [10] INFO: Pomyślnie wypełniono tabelę w SQLite. Czas trwania to 3548 milisekund
  11. [10] INFO: Pomyślnie wypełniono tabelę w MySQL. Czas trwania to 3640 milisekund
  12. [10] INFO: Pomyślnie wybrano z tabeli. Czas trwania dla SQLite to 1678 milisekund
  13. [10] INFO: Pomyślnie wybrano z tabeli. Czas trwania dla MySQL to 182 milisekund[/code]
  14. A tutaj kod:
  15. [code]local MySQL_HOST  = "HOST"
  16. local MySQL_USER  = "USER"
  17. local MySQL_PASS  = "PASS"
  18. local MySQL_DB    = "DB"
  19. local MySQL_PORT  = 3306
  20.  
  21. local Connection        = dbConnect("sqlite", "sqlite.db")
  22. local MySQLConnection   = dbConnect("mysql", "dbname=" .. MySQL_DB .. ";host=" .. MySQL_HOST, MySQL_USER, MySQL_PASS, "share=1", "port=" .. MySQL_PORT)
  23. local TABELA            = "TABELA"
  24. local Handler_DB        = nil
  25. local Number            = 250000
  26.  
  27. addEventHandler("onResourceStart", resourceRoot, function()
  28.     HandleQuery = dbQuery(Connection, "CREATE TABLE IF NOT EXISTS " .. TABELA .. " (Tekst TEXT, ID INTEGER);")
  29.     MySQLQuery = dbQuery(MySQLConnection, "CREATE TABLE IF NOT EXISTS " .. TABELA .. " (Tekst TEXT, ID INT(2);")
  30.     local Result = dbPoll(HandleQuery, -1) and dbFree(HandleQuery) and dbPoll(MySQLQuery, -1) and dbFree(MySQLQuery)
  31.    
  32.     local NOW = getTickCount()
  33.    
  34.     for i = 0, Number do
  35.         print()
  36.     end
  37.     local TIME__ = getTickCount() - NOW
  38.     outputDebugString("Czas wykonania pętli - " .. TIME__ .. " milisekund.", 3)
  39.    
  40.     if not Connection then
  41.         outputDebugString("Brak połączenia z bazą danych SQLite.", 1)
  42.     elseif not MySQLConnection then
  43.         outputDebugString("Brak połączenia z bazą danych MySQL.", 1)
  44.     else
  45.         outputDebugString("Połączono z bazą danych.", 3)
  46.         Fill_Table()
  47.         Show_Table()
  48.     end
  49. end)
  50.  
  51. function Fill_Table()
  52.     local NOW = getTickCount()
  53.     SQLite_Query = dbQuery(Connection, "BEGIN TRANSACTION;")
  54.     for i = 0, Number do
  55.         SQLite_Query = dbQuery(Connection, "INSERT OR REPLACE INTO " .. TABELA .. " (Tekst, ID) VALUES (?, ?)", "Tekst nr" .. i, i)
  56.     end
  57.     SQLite_Query = dbQuery(Connection, "END TRANSACTION;")
  58.     local Difference = getTickCount() - NOW
  59.     outputDebugString("Pomyślnie wypełniono tabelę w SQLite. Czas trwania to " .. Difference .. " milisekund", 3)
  60.  
  61.     local NOW__ = getTickCount()
  62.     MySQL_Query = dbQuery(MySQLConnection, "START TRANSACTION;")
  63.     for i__ = 0, Number do
  64.         MySQL_Query = dbQuery(Connection, "INSERT INTO " .. TABELA .. " (Tekst, ID) VALUES (?, ?)", "Tekst nr" .. i__, i__)
  65.     end
  66.     MySQL_Query = dbQuery(MySQLConnection, "COMMIT;")
  67.     local Difference__ = getTickCount() - NOW__
  68.     outputDebugString("Pomyślnie wypełniono tabelę w MySQL. Czas trwania to " .. Difference__ .. " milisekund", 3)
  69. end
  70.  
  71. function Show_Table()
  72.     local NOW = getTickCount()
  73.     local QUERY__ = dbQuery(Connection, "BEGIN TRANSACTION;")
  74.     local QUERY__ = dbQuery(Connection, "SELECT ID FROM " .. TABELA .. "")
  75.     local QUERY__ = dbQuery(Connection, "END TRANSACTION;")
  76.     local Result = dbPoll(QUERY__, -1) and dbFree(QUERY__)
  77.     local Difference = getTickCount() - NOW
  78.     outputDebugString("Pomyślnie wybrano z tabeli. Czas trwania dla SQLite to " .. Difference .. " milisekund", 3)
  79.    
  80.     local NOW__ = getTickCount()
  81.     local QUERY____ = dbQuery(MySQLConnection, "START TRANSACTION")
  82.     local QUERY____ = dbQuery(MySQLConnection, "SELECT ID FROM " .. TABELA)
  83.     local QUERY____ = dbQuery(MySQLConnection, "COMMIT;")
  84.     local Result = dbPoll(QUERY____, -1) and dbFree(QUERY____)
  85.     local Difference__ = getTickCount() - NOW__
  86.     outputDebugString("Pomyślnie wybrano z tabeli. Czas trwania dla MySQL to " .. Difference__ .. " milisekund", 3)
  87. end
  88.  
  89. addCommandHandler("insert", Fill_Table)
  90. addCommandHandler("show", Show_Table)[/code]
  91. 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