Вставить автоматически на новую таблицу? - PullRequest
0 голосов
/ 30 октября 2009

Я создам 5 таблиц, а именно таблицы data1, 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, это займет некоторое время, чтобы сделать всю проверку.Есть ли лучший способ решить эту проблему?

Ответы [ 6 ]

3 голосов
/ 30 октября 2009

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

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

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

1 голос
/ 30 октября 2009

Узнайте, как считать строки в mysql .

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

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

0 голосов
/ 30 октября 2009

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

Прочтите эту статью или официальная документация

0 голосов
/ 30 октября 2009

Вы можете создать таблицу MERGE , например:

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

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

0 голосов
/ 30 октября 2009

Я был бы удивлен, если бы в 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';

Это означает, что вы всегда будете вставлять в таблицу «данные», а «данные1», «данные2», «данные3» и т. Д. Являются вашими архивными версиями этой таблицы.

0 голосов
/ 30 октября 2009

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

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

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

$i = 1;
do {
  $rowCount = mysql_fetch_field(mysql_query("SELECT count(*) FROM data$i"));
  $i++;
} while ($rowCount >= 1000); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...