Doctrine2 и разбиение MySQL

Есть ли у кого-нибудь опыт использования функции разбиения на разделы в сочетании с библиотекой Doctrine2?

Первая проблема заключается в том, что Doctrine создает внешние ключи для ассоциативных столбцов. Кто-нибудь знает, как это предотвратить или отключить?

И вторая проблема, как указать пользовательское определение таблицы (PARTITION BY...)?

Заранее спасибо!


person Vladimir Kartaviy    schedule 26.05.2011    source источник
comment
Вы, вероятно, получите лучшие результаты, если разделите это на два вопроса.   -  person    schedule 26.05.2011
comment
Если вы стремитесь к быстрому увеличению производительности с помощью разделов и доктрины - не делайте этого. Более мощный сервер дешевле. А перегородки только путаницу внесут.   -  person Ernestas Stankevičius    schedule 27.11.2017


Ответы (2)


Вам не повезло!!

Во-первых, удалите все внешние ключи из всех таблиц, которыми управляет D2. Скопируйте и выполните результат этого запроса:

SET SESSION group_concat_max_len=8192; -- // increase this if you do not see the full list of your tables
SELECT IFNULL(REPLACE(GROUP_CONCAT('ALTER TABLE ',TABLE_NAME,' DROP FOREIGN KEY ',CONSTRAINT_NAME,'; '), ',', ''), '') FROM information_schema.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE='FOREIGN KEY';

Затем переопределите метод supportsForeignKeyConstraints() в /vendor/doctrine-dbal/lib/Doctrine/DBAL/Platforms/MySqlPlatform.php (или в другом месте, где находится этот класс), чтобы:

public function supportsForeignKeyConstraints()
{
    return false;
}

Это не позволит Doctrine создавать ограничения внешнего ключа для вашей следующей команды doctrine:schema:update. После этого вы можете просто выполнить оператор ALTER TABLE PARTITION BY..., где это необходимо (D2 не поддерживает секционирование на уровне схемы). Я рекомендую вам сначала создать резервную копию и усечь свои таблицы (используя --no-create-info), чтобы изменения структуры выполнялись как можно быстрее, а затем восстановить их.

Как говорит этот парень здесь и исходя из моего личного опыта, D2 не волнует, есть ли у вас FK или нет, если есть правильные определения отношений.

PS: В настоящее время я работаю над расширением синтаксиса аннотаций для поддержки правильных определений таблиц и столбцов, включая ENGINE (это может быть полезно), PARTITION BY и массив @Column options (т.е. {"fixed"=true, "unsigned"=true, "default"=0})

Общие усилия составляют пару бессонных ночей для обратного проектирования и исправления кода, надеюсь, вы сделаете это быстрее :)

person Shellcat    schedule 20.03.2013

Механизм PARTITION в MySQL имеет серьезные ограничения в отношении ключей. Пожалуйста, ознакомьтесь с последними документами, в настоящее время здесь: http://dev.mysql.com/doc/refman/5.1/en/partitioning-limitations-partitioning-keys-unique-keys.html

Если Doctrine требует ключей, которые Partition не поддерживает, вам не повезло. Движок разделов очень ограничен по дизайну - он предназначен для архивного хранения, которое редко читается. Немногие приложения, поддерживающие MySQL, будут работать с Partition, если вы не внесете изменения.

Я бы предложил использовать Partition по назначению - архивирование. Храните ваши данные в более распространенном движке данных MySQL.

person Scott Prive    schedule 10.08.2011