2017-05-12 12 views
-3

私は実生活テストデータを含むPHPクエリとデータベーステーブルを提供しました。なぜMySQLクエリは実行が遅いのですか?それをスピードアップするために私が変えることができるものはありますか?実行時間は約40秒で、テーブルには約2929レコードあります。このMySQLクエリの実行が遅いのはなぜですか?

クエリ。

$invoice_details_query = mysqli_query($con,"SELECT i.*, 

ifnull(SUM(ip.invoice_payment_amount),0) as paid, 
(i.invoice_total_amount_exc_vat + i.invoice_total_vat_amount) - ifnull(SUM(ip.invoice_payment_amount),0) as due 
FROM accounts_invoice i 
LEFT JOIN accounts_invoice_payment ip 
ON ip.invoice_payment_invoice_id = i.invoice_id 
WHERE i.invoice_posted='1' 
GROUP BY i.invoice_id 
HAVING due>0 
ORDER BY i.invoice_id ASC") or die(mysql_error()); 

$total = mysqli_num_rows($invoice_details_query); 

データベース構造(データなし)。

-- phpMyAdmin SQL Dump 
-- version 4.6.6 
-- https://www.phpmyadmin.net/ 
-- 
-- Host: localhost:3306 
-- Generation Time: May 12, 2017 at 09:56 PM 
-- Server version: 5.6.35 
-- PHP Version: 5.6.30 

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; 
SET time_zone = "+00:00"; 


/*!40101 SET @[email protected]@CHARACTER_SET_CLIENT */; 
/*!40101 SET @[email protected]@CHARACTER_SET_RESULTS */; 
/*!40101 SET @[email protected]@COLLATION_CONNECTION */; 
/*!40101 SET NAMES utf8mb4 */; 

-- 
-- Database: `propsyst_main` 
-- 

-- -------------------------------------------------------- 

-- 
-- Table structure for table `accounts_invoice` 
-- 

CREATE TABLE `accounts_invoice` (
    `invoice_id` int(11) NOT NULL, 
    `invoice_token` varchar(40) COLLATE utf8_bin DEFAULT NULL, 
    `invoice_customer_type` tinyint(4) DEFAULT NULL, 
    `invoice_customer` int(11) DEFAULT NULL, 
    `invoice_date` date DEFAULT NULL, 
    `invoice_due_date` date DEFAULT NULL, 
    `invoice_property_id` int(11) DEFAULT NULL, 
    `invoice_tenancy_id` int(11) DEFAULT NULL, 
    `invoice_branch` int(11) DEFAULT NULL, 
    `invoice_payment_terms` tinyint(4) DEFAULT NULL, 
    `invoice_notes` text COLLATE utf8_bin, 
    `invoice_total_amount_exc_vat` decimal(10,2) DEFAULT NULL, 
    `invoice_total_vat_amount` decimal(10,2) DEFAULT NULL, 
    `invoice_posted` tinyint(4) DEFAULT '0', 
    `invoice_overdue_reminders` tinyint(4) NOT NULL DEFAULT '1', 
    `invoice_date_created` datetime DEFAULT NULL, 
    `invoice_date_updated` datetime DEFAULT NULL, 
    `invoice_date_posted` datetime DEFAULT NULL, 
    `invoice_created_by` int(11) DEFAULT NULL, 
    `invoice_updated_by` int(11) DEFAULT NULL, 
    `invoice_posted_by` int(11) DEFAULT NULL 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin; 

-- 
-- Indexes for dumped tables 
-- 

-- 
-- Indexes for table `accounts_invoice` 
-- 
ALTER TABLE `accounts_invoice` 
    ADD PRIMARY KEY (`invoice_id`); 

-- 
-- AUTO_INCREMENT for dumped tables 
-- 

-- 
-- AUTO_INCREMENT for table `accounts_invoice` 
-- 
ALTER TABLE `accounts_invoice` 
    MODIFY `invoice_id` int(11) NOT NULL AUTO_INCREMENT; 
/*!40101 SET [email protected]_CHARACTER_SET_CLIENT */; 
/*!40101 SET [email protected]_CHARACTER_SET_RESULTS */; 
/*!40101 SET [email protected]_COLLATION_CONNECTION */; 

はANALYZE EXPLAIN。

Current selection does not contain a unique column. Grid edit, checkbox, Edit, Copy and Delete features are not available. 

Your SQL query has been executed successfully. 

explain accounts_invoice 



invoice_id int(11) NO PRI  auto_increment 
invoice_token varchar(40) YES    
invoice_customer_type tinyint(4) YES    
invoice_customer int(11) YES    
invoice_date date YES    
invoice_due_date date YES    
invoice_property_id int(11) YES    
invoice_tenancy_id int(11) YES    
invoice_branch int(11) YES    
invoice_payment_terms tinyint(4) YES    
invoice_notes text YES    
invoice_total_amount_exc_vat decimal(10,2) YES    
invoice_total_vat_amount decimal(10,2) YES    
invoice_posted tinyint(4) YES  0  
invoice_overdue_reminders tinyint(4) NO  1  
invoice_date_created datetime YES    
invoice_date_updated datetime YES    
invoice_date_posted datetime YES    
invoice_created_by int(11) YES    
invoice_updated_by int(11) YES    
invoice_posted_by int(11) YES    

実数テストデータを持つデータベース。

Download MySQL data

+2

インデックスを作成しましたか?パフォーマンスに関する質問には、 'EXPLAIN ANALYZE'とテーブルサイズ、インデックス、現在の時間パフォーマンス、欲求時間などに関する情報が含まれていなければなりません。'スロー 'は相対的な用語であり、比較するには本当の価値が必要です。 \t \t [** MySQLの**](http://dba.stackexchange.com/questions/15371/how-do-i-get-the-execution-plan-for-a-view) –

+0

@JuanCarlosOropeza I質問にデータベース構造をダンプしました。 –

+0

MyISAMとインデックスはありませんか?それは本当に成功のためのレシピではありません。可能であればInnoDBを使用してください。これは適切でトランザクション性のあるMVCC対応のデータベースエンジンで、拡大縮小が容易で、WHERE句やGROUP BY句で使用されるカラムにインデックスを追加することができます。 – tadman

答えて

1

各テーブルのSHOW CREATE TABLEを提供してください。 invoice_payment_invoice_idで始まるインデックスが見つからないようです。

また、小額の請求書のみが転記される場合は、INDEX(invoice_posted, invoice_id)が有益です。

+0

ありがとうございます。私はinvoice_id、invoice_posted、およびinvoice_payment_invoice_idのインデックスを作成しており、クエリの実行ははるかに高速です。パフォーマンスをさらに向上させるためにお勧めすることはありますか? –

+0

2つの別々のインデックスではなく、最後のペアに「複合」インデックスを作成することをお勧めしました。 [_creating indexes_]に関する詳細(http://mysql.rjweb.org/doc.php/index_cookbook_mysql) –

関連する問題