簡體   English   中英

MySQL結果轉JSON的效率

[英]Efficiency of converting MySQL result to JSON

我使用 MySql 后端來存儲我們在單頁角度應用程序中使用的數據。 我們將數據從服務器發送並存儲在 Chrome 內部的 IndexedDB 中。 我們有相當多的信息表,但特別是有一個大約有 20k 個條目,接近 300 個字段。 當我們最初開發平台時,我們運行了一個標准的 SQL 查詢,然后我們對結果進行迭代以構建一個 JSON 語句來返回。 這個過程大約需要 35 秒,所以我們一直在尋求改進。 從那以后,我一直在使用 MySQL 中更多的特定 JSON 工具進行測試,例如 json_array 和 json_arrayagg。 我發現我已經從一個非常快的 select 語句和一個緩慢的迭代過程變成了一個不需要迭代的非常慢的 select 語句。 總之,它所花費的時間沒有任何改善。 我可以使用更有效的流程來加快速度嗎? 作為參考,迭代是在 PHP 中完成的,以防在那里可以使用某些東西。

好的,編輯以解決一些評論。 我們正在向客戶提供如此數量的數據。 我們實際上有幾個這種大小的表,我們在前端使用 ag-grid,因此用戶可以過濾、排序、分組等。所以我們在登錄時本地加載所有數據,並在初始加載后提供快速環境。 我正在尋求改進的初始負載。 對於更多的上下文,這些表之一是產品數據庫。 我們的用戶將轉到數據庫並可以按任何可用字段進行過濾。 篩選依據的選項由網格中已有的數據生成。 這只是一個例子,但長話短說,我們需要本地數據。

我通過記錄 sql 語句周圍的時間戳以及處理 sql 結果的 while 循環之前和之后來測量時間。

創建 JSON 后返回的時間很少(幾秒鍾)。

我們實際上是根據運行它的模塊動態構建 sql 語句的,但作為參考,這里是如何構建 select 的。 大模塊顯然會列出每個字段:

$select = " SELECT json_objectagg(json_object(
                 'docType' VALUE 'EXOAD_BidGroup',
                 'date_modified' VALUE exoad_bidgroup.date_modified ABSENT ON NULL,
                 'name' VALUE exoad_bidgroup.name ABSENT ON NULL,
                 'deleted' VALUE exoad_bidgroup.deleted ABSENT ON NULL,
                 'id' VALUE exoad_bidgroup.id ABSENT ON NULL,
                 '_id' VALUE exoad_bidgroup._id ABSENT ON NULL,
                 'isChanged' VALUE '0')) ";

最初的過程是一個基本的 select 語句,然后我們用以下內容迭代結果以在返回之前將 JSON 拼湊在一起:

while ($row = $GLOBALS['db']->fetchByAssoc($dbResult)) {
                $id                        = $row['id'];
                $singleResult              = array();
                $singleResult['docType']   = $module;
                $singleResult['_id']       = $row['id'];
                $singleResult['isChanged'] = 0;
                $parentKeyValue            = '';
                if ($isHierarchical == 'Yes') {
                    if (isset($row[$parentModuleKey]) && $row[$parentModuleKey] != ''){
                        $parentKeyValue = $row[$parentModuleKey];
                    } else {
                        continue;
                    }
                }
                foreach ($row as $key => $value) {
                    if ($value !== null && trim($value) <> '' && $key !== 'user_hash') { //put this in tenant utils
                        $singleResult[$key] = html_entity_decode($value, ENT_QUOTES);
                    }
                }

                $result_count++;
                if ($isHierarchical == 'Yes' && $parentKeyValue != '') {
                    if (!isset($output_list[$module . '-' . $parentKeyValue])) {
                        $GLOBALS['log']->info('hier module key -->> ' . $module . '-' . $parentKeyValue);
                        $output_list[$module . '-' . $parentKeyValue] = array();
                    }
                    $output_list[$module . '-' . $parentKeyValue][$id] = $singleResult;
                } else {
                    $output_list[$id] = $singleResult;
                }
            }

如果我可以提供任何其他詳細信息,請告訴我。

另一個編輯...

時間肯定花在 while 語句中的 foreach 循環內。 我沒有確切的數字,但如果沒有那個 foreach,整個過程會下降到幾秒鍾。 但是……這就是數據被格式化為 JSON 的方式,所以任何關於加速該部分的想法都是我正在尋找的。 我的猜測是它不存在,但如果有一些 php 函數可以獲取每個結果行並將數據轉換為 json 而不遍歷每個字段,那就太好了。

可以比下載所有行然后在應用程序中過濾更快地搜索索引良好的表以查找所需的行。

看起來您主要是在這里轉義引號。 您是否嘗試過在 mysql 中使用QUOTE()函數作為查詢的一部分?

您可以查看這是否有助於作為選擇語句的一部分。 查看此示例以了解如何使用它。

那么也許你可以注釋掉那個foreach循環,然后對你的while循環的結果運行json_encode()

我很想知道這是否適合您,以及它是否有任何性能改進。 讓我知道。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM