2009-10-30 3 views
-1

Я создам 5 таблиц, а именно таблицы данных1, data2, data3, data4 и data5. Каждая таблица может хранить только 1000 записей данных.Вставить автоматически на новый стол?

Когда новая запись, или когда я хочу, чтобы вставить новые данные, я должен сделать чек,

$ data1 = mysql_query (SELECT * FROM data1);

<?php 
    if(mysql_num_rows($data1) > 1000){ 
    $data2 = mysql_query(SELECT * FROM data2); 
    if(mysql_num_rows($data2 > 1000){ 
     and so on... 
    } 
    } 

Я думаю, что это не так? Я имею в виду, если я пользователь 4500, потребуется некоторое время, чтобы сделать все чек. Есть ли лучший способ решить эту проблему?

+2

Не могли бы вы рассказать о причине ограничения 1000 записей? – deceze

+0

Я решил выбрать номер, это может быть 5000 или 10000 данных. Причина в гибкости и мобильности? Ну, один из моих sql-гуру предложил мне сделать так: – myphpsql00

ответ

3

гавани я решила цифры, это может быть 5000 или 10000. Причина в гибкости и мобильности? Ну, один из моих гуру SQL предложить мне сделать этот путь

Если ваш гуру не говорил о чем-то вроде Partitioning, я серьезно сомневаюсь, что его совет. Если ваша база данных не может обрабатывать более 1000, 5000 или 10000 строк, найдите другую базу данных. Если у вас нет конкретного примера, как лимит записи вам поможет, он, вероятно, не будет. С увеличением количества накладных расходов он добавляет, что это, вероятно, только усложняет ситуацию без выгоды.

Правильно настроенная таблица базы данных может легко обрабатывать миллионы записей. Разделение его на отдельные таблицы, скорее всего, не увеличит гибкость и переносимость. Если вы накапливаете достаточное количество записей для решения проблем производительности, поздравляйте себя с хорошо выполненной работой и волнуйтесь об этом.

+2

+1. Всегда проверяйте достоверность таких утверждений. Фактически, если рассматриваемый человек называет себя гуру, немедленно игнорируйте его совет. ;-) – Duroth

+1

+1 'потому что я тоже не вижу причин для этого. Он не делает запросы быстрее, это не помогает в обеспечении безопасности данных ... единственная причина, по которой я могу думать, заключается в том, что файлы базы данных не должны быть больше xxxKB ... но для этого и не существует никаких причин. – Bobby

0

Вы можете сохранить таблицу отслеживания, чтобы отслеживать текущую таблицу между запросами.

быть также в состоянии боевой готовности для условий гонки (использование транзакций, или страховать только один процесс выполняется в то время.)

Также не $data1 = mysql_query(SELECT * FROM data1); с вложенными если, сделайте что-то вроде:

$i = 1; 
do { 
    $rowCount = mysql_fetch_field(mysql_query("SELECT count(*) FROM data$i")); 
    $i++; 
} while ($rowCount >= 1000); 
1

Подробнее о том, как count rows in mysql.

В зависимости от того, какой механизм базы данных вы используете, выполнение операций count (*) на таблицах InnoDB довольно дорогое, и эти подсчеты должны выполняться триггерами и отслеживаться в соседней информационной таблице.

Структура, которую вы описываете, часто создается вокруг таблицы отображения. Один запрашивает таблицу сопоставления, чтобы найти таблицу назначения, связанную с первичным ключом.

0

Я был бы удивлен, если бы у MySQL не было каких-либо причудливых способов управлять этим автоматически (или, по крайней мере, лучше того, что я собираюсь предложить), но вот один из способов сделать это.

1. Insert record into 'data' 
2. Check the length of 'data' 
3. If >= 1000, 
    - CREATE TABLE 'dataX' LIKE 'data'; 
     (X will be the number of tables you have + 1) 
    - INSERT INTO 'dataX' SELECT * FROM 'data'; 
    - TRUNCATE 'data'; 

Это означает, что вы всегда будете вставлять в таблицу «данные», и «data1», «data2», «data3», и т.д. заархивированные версии этой таблицы.

0

Вы можете create a MERGE table так:

CREATE TABLE all_data ([col_definitions]) ENGINE=MERGE UNION=(data1,data2,data3,data4,data5); 

Тогда вы могли бы подсчитать общее количество строк с запросом, как SELECT COUNT(*) FROM all_data.

0

Если вы используете MySQL 5.1 или выше, вы можете позволить базе справиться с этим (почти) автоматически с помощью перегородки:

Read this article или the official documentation

Смежные вопросы