Назад | Перейти на главную страницу

почему у mysql намного больше открытых и фрагментированных таблиц, чем таблиц в БД?

Я работал над тем, чтобы наша база данных работала немного более плавно, и за последнюю неделю добился хороших результатов. Но есть еще кое-что, чего я не понимаю.

Во-первых, в базе данных 25 таблиц. Но статус mysql показывает, что 512 открыты: статус mysqladmin Время работы: 212854 Потоки: 1 Вопросы: 43041 Медленные запросы: 7 Открытие: 2605 Очистить таблицы: 1 Открытые таблицы: 512 запросов в секунду в среднем: 0,202

Я читал, что isam открывает дополнительные файловые дескрипторы и еще несколько причин, по которым количество открытых таблиц может быть больше 25, но я предполагаю, что 512 - это нехорошо. Любые предложения о том, почему это может быть или что мне следует изучить?

Я также использовал mysqltuner, и это было полезно. Но он постоянно перечисляет количество фрагментированных таблиц на уровне 207. В phpmyadmin я выбрал все таблицы и оптимизировал их несколько раз. Это не уменьшило количество фрагментированных таблиц, о которых сообщает mysqltuner.

Я думаю, мне не хватает важной концепции того, как все это работает. Есть ли у кого-нибудь предложения, чтобы указать мне в правильном направлении, сузить поиск в Google или просто помочь мне стать менее невежественным?

Спасибо!

-------- General Statistics --------------------------------------------------
[--] Skipped version check for MySQLTuner script
[OK] Currently running supported MySQL version 5.5.20-log
[OK] Operating on 64-bit architecture

-------- Storage Engine Statistics -------------------------------------------
[--] Status: +Archive -BDB -Federated +InnoDB -ISAM -NDBCluster
[--] Data in MyISAM tables: 1M (Tables: 254)
[--] Data in InnoDB tables: 3M (Tables: 199)
[--] Data in PERFORMANCE_SCHEMA tables: 0B (Tables: 17)
[!!] Total fragmented tables: 200

-------- Security Recommendations  -------------------------------------------
[OK] All database users have passwords assigned

-------- Performance Metrics -------------------------------------------------
[--] Up for: 3d 12h 5m 8s (142K q [0.472 qps], 11K conn, TX: 105M, RX: 37M)
[--] Reads / Writes: 79% / 21%
[--] Total buffers: 202.0M global + 2.5M per thread (100 max threads)
[OK] Maximum possible memory usage: 452.0M (48% of installed RAM)
[OK] Slow queries: 0% (8/142K)
[OK] Highest usage of available connections: 9% (9/100)
[OK] Key buffer size / total MyISAM indexes: 16.0M/741.0K
[OK] Key buffer hit rate: 99.9% (404K cached / 513 reads)
[OK] Query cache efficiency: 72.1% (61K cached / 84K selects)
[OK] Query cache prunes per day: 0
[OK] Sorts requiring temporary tables: 0% (0 temp sorts / 1K sorts)
[!!] Temporary tables created on disk: 41% (6K on disk / 14K total)
[OK] Thread cache hit rate: 99% (9 created / 11K connections)
[!!] Table cache hit rate: 15% (512 open / 3K opened)
[OK] Open file limit used: 55% (633/1K)
[OK] Table locks acquired immediately: 100% (40K immediate / 40K locks)
[!!] Connections aborted: 7%
[OK] InnoDB data size / buffer pool: 3.3M/16.0M

-------- Recommendations -----------------------------------------------------
General recommendations:
    Run OPTIMIZE TABLE to defragment tables for better performance
    When making adjustments, make tmp_table_size/max_heap_table_size equal
    Reduce your SELECT DISTINCT queries without LIMIT clauses
    Increase table_cache gradually to avoid file descriptor limits
    Your applications are not closing MySQL connections properly
Variables to adjust:
    tmp_table_size (> 128M)
    max_heap_table_size (> 128M)
    table_cache (> 512)

Вероятно, это связано с table_cache и / или max_connections.

В таблицах MyISAM каждый новый поток / соединение должен открывать таблицу. Другими словами, если у вас есть одна таблица и десять клиентов, обращающихся к этой таблице, у вас есть десять открытых таблиц в соответствии со строкой состояния MySQL. В table_cache помогает уменьшить постоянную работу по открытию / закрытию таблиц, сохраняя таблицы открытыми для потоков.

Кажется, что ваш кеш таблиц работает достаточно хорошо, поскольку было выполнено 43 041 запрос, но на самом деле таблицы нужно было открывать только 2605 раз.

InnoDB имеет собственный пул соединений и ведет себя немного иначе.

Для получения дополнительной информации см. как MySQL открывает и закрывает таблицы.