PHP/MYSQL - Продвижение его к пределу?

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

var resultArray = array1.filter(function(arr) {
    return array2.indexOf(arr.id) !== -1;
}).map(function(item) {
    return {
        name: item.name
    };
});
5
задан Mickey 20 April 2009 в 04:52
поделиться

6 ответов

Мы занимались этим в том месте, где я работал в прошлом году, поэтому все лето. Мы не требовали особой детализации информации, поэтому для нас хорошо работало объединение данных за разные периоды времени. Например, у нас будет статистика за один день в реальном времени, после чего она будет помещена в некоторые ежедневные суммы, а затем выведена в ежемесячную таблицу.

Это, очевидно, имеет ряд огромных недостатков, а именно потерю зернистость. Мы рассмотрели много разных подходов в то время. Например, как вы сказали, CSV или другой подобный формат потенциально может служить способом обработки месячных данных за раз. Большая проблема - вставки однако.

Начните с установки некоторой примерной схемы с точки зрения ТОЧНОЙ информации, которую вам нужно хранить, и при этом вы ' Я буду руководствоваться (через изменения) тем, что будет работать для вас.

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

6
ответ дан 14 December 2019 в 04:47
поделиться

For the kind of activity you're looking at, you need to look at the problem from a new point of view: decoupling. That is, you need to figure out how to decouple the data-recording steps so that delays and problems don't propogate back up the line.

You have the right idea in logging hits to a database table, insofar as that guarantees in-order, non-contended access. This is something the database provides. Unfortunately, it comes at a price, one of which is that the database completes the INSERT before getting back to you. Thus the recording of the hit is coupled with the invocation of the hit. Any delay in recording the hit will slow the invocation.

MySQL offers a way to decouple that; it's called INSERT DELAYED. In effect, you tell the database "insert this row, but I can't stick around while you do it" and the database says "okay, I got your row, I'll insert it when I have a minute". It is conceivable that this reduces locking issues because it lets one thread in MySQL do the insert, not whichever you connect to. Unfortuantely, it only works with MyISAM tables.

Another solution, which is a more general solution to the problem, is to have a logging daemon that accepts your logging information and just en-queues it to wherever it has to go. The trick to making this fast is the en-queueing step. This the sort of solution syslogd would provide.

2
ответ дан 14 December 2019 в 04:47
поделиться

По моему мнению, хорошо бы придерживаться MySQL для регистрации посещений, потому что он предоставляет инструменты для анализа ваших данных , Чтобы уменьшить нагрузку, у меня были бы следующие предложения:

  • Создать таблицу быстрого сбора, без указателей, кроме первичного ключа, myisam, по одной строке за попадание
  • Создать нормализованную структуру данных для попаданий и перемещать записи один раз за день для этой базы данных.

Это дает вам меньший удар по производительности для ведения журнала и хорошо проиндексированную нормализованную структуру для запросов / анализа.

1
ответ дан 14 December 2019 в 04:47
поделиться

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

Это добавило бы некоторую сложность. Вы проверяли или рассматривали тестирование с регулярными запросами? Т.е. увеличить счетчик с помощью запроса UPDATE (потому что вам не нужна каждая запись в отдельной строке). Вы можете обнаружить, что это не так сильно тормозит, как вы думали, хотя, очевидно, если вы запускаете 80 000 000 просмотров страниц в день, у вас, вероятно, совсем не будет места для маневра.

0
ответ дан 14 December 2019 в 04:47
поделиться

I think that using MySQL is an overkill for the task of collecting the logs and summarizing them. I'd stick to plain log files in your case. It does not provide the full power of relational database management but it's quite enough to generate summaries. A simple lock-append-unlock file operation on a modern OS is seamless and instant. On the contrary, using MySQL for the same simple operation loads the CPU and may lead to swapping and other hell of scalability.

Mind the storage as well. With plain text file you'll be able to store years of logs of a highly loaded website taking into account current HDD price/capacity ratio and compressability of plain text logs

-1
ответ дан 14 December 2019 в 04:47
поделиться

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

  1. Вам нужно будет регулярно разбивать вашу таблицу аудита (ежечасно, ежедневно?), Если не что иное, чтобы вы могли отбросить старые разделы, чтобы разумно управлять пространством. УДАЛЕНИЕ 10M строк не очень круто.
  2. Ваши веб-серверы (так как вы будете использовать довольно большую ферму, верно?), Вероятно, захотят выполнять вставку большими партиями асинхронно. У вас будет процесс-демон, который читает журналы с плоскими файлами на компьютере с веб-сервером и объединяет их в пакеты. Это важно для производительности InnoDB и во избежание замедления аудита веб-серверов. Более того, если ваша база данных недоступна, ваши веб-серверы должны продолжать обслуживать веб-запросы и по-прежнему проводить их аудит (в конечном итоге)
  3. Поскольку вы собираете большие объемы данных, потребуется некоторое суммирование, чтобы отчитаться о них с разумной скоростью - как вы сделать это очень дело вкуса. Сделайте разумные выводы.
  4. Настройка двигателя InnoDB - вам нужно будет значительно настроить двигатель InnoDB - в частности, взгляните на переменные, управляющие его использованием очистки диска. Записывать журнал при каждом коммите не будет круто (возможно, если он не на SSD - если вам нужна производительность и долговечность, рассмотрите SSD для журналов) :) Убедитесь, что ваш буферный пул достаточно большой. Лично я бы использовал плагин InnoDB и опцию «файл на таблицу», но вы также можете использовать MyISAM, если полностью понимаете его характеристики и ограничения.

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

При условии, что у вас не слишком много индексов, 1000 строк в секунду не являются нереалистичными при ваших размерах данных на современном оборудовании; иногда мы их вставляем (и, вероятно, имеем гораздо больше индексов).

Не забудьте протестировать производительность на оборудовании производственной спецификации (мне не нужно вам об этом говорить, верно?).

1000 строк в секунду - это нереально с вашими размерами данных на современном оборудовании; иногда мы их вставляем (и, вероятно, имеем гораздо больше индексов).

Не забудьте протестировать производительность на оборудовании производственной спецификации (мне не нужно вам об этом говорить, верно?).

1000 строк в секунду - это нереально с вашими размерами данных на современном оборудовании; иногда мы их вставляем (и, вероятно, имеем гораздо больше индексов).

Не забудьте протестировать производительность на оборудовании производственной спецификации (мне не нужно вам об этом говорить, верно?).

0
ответ дан 14 December 2019 в 04:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: