Наиболее эффективный алгоритм извлечения данных из базы данных


Поэтому я удаляю соединения из своих запросов, готовясь перейти на Кассандру, которая не поддерживает это, а вместо этого поддерживает множество операторов select. Я провел тестовый тест на 50 строках данных в моей таблице mysql (то, что я сейчас использую), в результате которого было выполнено 101 запрос (все выбранные), и для выполнения всех этих запросов потребовалось ~0,035 секунды. Затем я изменил это на некоторые манипуляции с массивами (в настоящее время в PHP) и сократил это до 3 запросов с кучей O(n) для петель.

Я предполагаю, работает ли моя система на PHP, Python, MySQL или Cassandra (NoSQL), что обрабатывать данные намного быстрее, используя несколько циклов O(n), а не намного больше запросов, я сократил время с 0,035 с до 0,004 с, используя этот новый метод, как показано ниже.

Есть какие-нибудь альтернативные методы, чтобы сократить это еще больше? Или я на правильном пути? Есть случаи, когда быстрее выполнять все запросы (кроме случаев, когда он становится O(n^2))? Спасибо:

// Now go through and get all of the user information (This is slower in mysql, but maybe faster in cassandra)
        /*foreach ($results as $key => $row)
        {
            // Create query
            $query = DB::select('id', 'username', 'profile_picture')->from('users')->where('id', '=', $row['uid']);

            // Execute it
            $results2 = $query->execute(null, false);

            // Join it
            $data[$key] = array_merge($row, $results2[0]);
        }*/

        // Get all the user information (faster in mysql since less queries)
        $uids = array();
        $ids = array();
        foreach ($results as $key => $row)
        {
            if (!in_array($row['uid'], $uids))
                $uids[] = $row['uid'];
            if (!in_array($type, array('userProfile')))
                $ids[] = $row['comment_id'];
        }

        // Create query
        $query = DB::select('id', 'username', 'profile_picture')->from('users')->where('id', '=', $uids);

        // Execute it
        $results2 = $query->execute(null, false);

        $user_data = array();

        foreach ($results2 as $key => $row)
        {
            $user_data[$row['id']] = array('uid' => $row['id'], 'username' => $row['username'], 'profile_picture' => $row['profile_picture']);
        }

        foreach ($results as $key => $row)
        {
            $data[$key] = array_merge($row, $user_data[$row['uid']]);
        }
        // End faster user info section
Author: MasterGberry, 2012-08-15

2 answers

С помощью Cassandra вы можете запросить все свои ключи в одном запросе, используя несколько get, что намного быстрее, чем набор отдельных запросов. Иногда я запрашиваю тысячи ключей в запросе, и время ответа практически мгновенно.

 3
Author: rs_atl, 2012-08-16 13:16:08

Появляется все больше и больше инструментов, таких как PlayOrm (также есть необработанный специальный инструмент), которые поддерживают объединения, НО только в разделах таблиц (не во всех таблицах) и выполняют индексирование с помощью шаблонов nosql за кулисами. Ознакомьтесь с шаблоном широких рядов и посмотрите, будет ли это полезно для вас. Иногда это может помочь ускорить процесс.

 0
Author: Dean Hiller, 2012-08-21 14:38:37