1

Тема: Як ефективно працювати з БД MySQL ?

Пишу СУБД на Python + TKinter + MySQL.
Додаток одночасно використовує декілька БД.

1) При кожному зверненні до таблиці із БД відкриваю і закриваю з'єднання. Чи правильніше створити з'єднання на початку роботи СУБД і закрити вже по завершенні роботи?

2) Частину таблиць завантажую повнітю, а вже потім роблю всі необхідні фільтрування данних.  Чи правильніше фільтрувати данні на сервері, завантажуючи лише необхідні данні?

2

Re: Як ефективно працювати з БД MySQL ?

СУБД - це MySQL. Ви ж пишете якийсь застосунок, що використовує СУБД.
Власне, з питань видно, що ви вже зрозуміли відповіді :)
1. Треба знайти баланс, що залежить від вашого завдання. Якщо у вас маленька організація (до десятка робочих місць), то цілком нормально тримати з'єднання весь час. Якщо очікується, що клієнтів буде багато, то краще відкривати на початку роботи процедур і закривати наприкінці.
2. Для фільтрування існують інструкції SQL; якщо ви ще й індекси в БД додасте, то фільтрування буде дуже швидким.
Ну і не забувайте про бенчмарки.

Подякували: Vik_771

3

Re: Як ефективно працювати з БД MySQL ?

koala написав:

СУБД - це MySQL. Ви ж пишете якийсь застосунок, що використовує СУБД.
Власне, з питань видно, що ви вже зрозуміли відповіді :)
1. Треба знайти баланс, що залежить від вашого завдання. Якщо у вас маленька організація (до десятка робочих місць), то цілком нормально тримати з'єднання весь час. Якщо очікується, що клієнтів буде багато, то краще відкривати на початку роботи процедур і закривати наприкінці.
2. Для фільтрування існують інструкції SQL; якщо ви ще й індекси в БД додасте, то фільтрування буде дуже швидким.
Ну і не забувайте про бенчмарки.

Дякую.
Якщо правильно зрозумів то при малій кількості запитів до БД краще кожного разу підключатися/відключатися .

4 Востаннє редагувалося frz (19.11.2023 15:56:24)

Re: Як ефективно працювати з БД MySQL ?

Я використовую

import mysql.connector

try:
    conn = mysql.connector.connect(
        host='localhost',
        user='your_username',
        password='your_password',
        database='my_database'
    )

    cur = conn.cursor()

    cur.execute('SELECT * FROM my_table')

    conn.commit()

except mysql.connector.Error as e:
    print(f"An error occurred: {e.msg}")
    conn.rollback()

finally:
    if conn:
        conn.close()

Ви можете справедливо запитати, якого лисого робить коміт після селекту який нічого не змінює в таблиці. Однак якщо в вашому випадку MySQL використовує саме рушій InnoDB, то він робить лок на вибраних рядках аби в ту ж мілісекунду іншим запитом не було модифіковано результати саме цієї вибірки.

Що ж до finally, то ви мабуть себе недооцінюєте на даному етапі, та можливо апка набуде значного успіху і тоді якщо ви не закриваєте конекшн, в цей спосіб не звільняються алоковані ресурси; апка буде потребувати значно дорожчого vps просто через таку дрібницю.

5

Re: Як ефективно працювати з БД MySQL ?

frz написав:

Я використовую ....

Дякую велике.

Зустрічав що і (cur)  потрібно закривати ( cur.close() )

6

Re: Як ефективно працювати з БД MySQL ?

Vik_77 написав:
frz написав:

Я використовую ....

Дякую велике.

Зустрічав що і (cur)  потрібно закривати ( cur.close() )

Загалом так, тільки у випадку з MySQL коли закривається конекшн то і всі його ресурси теж закриваються.

А от скажімо pyodbc драйвер для SQL Server в Python цього не робить автоматично.

7

Re: Як ефективно працювати з БД MySQL ?

В розділі Java є загальні поради, які стосуються роботи з базами даних, не тільки MySQL.

Подякували: koala, Vik_772