2017-01-26 52 views
0

我有2個mysql服務器(master和slave)。我在Slave上啓用了InnoDB壓縮,之後mysql有時在查詢時選擇了錯誤的索引。InnoDB壓縮後Mysql錯誤索引

解釋上站長:

 

+----+-------------+-------+--------+---------------+---------+---------+-----------------------------+-----------+-------------+ 
| id | select_type | table | type | possible_keys | key  | key_len | ref       | rows  | Extra  | 
+----+-------------+-------+--------+---------------+---------+---------+-----------------------------+-----------+-------------+ 
| 1 | SIMPLE  | p  | range | PRIMARY  | PRIMARY | 8  | NULL      | 112017572 | Using where | 
| 1 | SIMPLE  | l  | eq_ref | PRIMARY  | PRIMARY | 8  |   p.loan_ID  |   1 | NULL  | 
| 1 | SIMPLE  | af | eq_ref | PRIMARY  | PRIMARY | 8  |   p.fromAccount_ID |   1 | Using where | 
| 1 | SIMPLE  | at | eq_ref | PRIMARY  | PRIMARY | 8  |   p.toAccount_ID |   1 | Using where | 
+----+-------------+-------+--------+---------------+---------+---------+-----------------------------+-----------+-------------+ 

解釋奴隸:

 

+----+-------------+-------+--------+-------------------------------------------------------------------------------+--------------------+---------+-----------------------------+--------+----------------------------------------------+ 
| id | select_type | table | type | possible_keys                 | key    | key_len | ref       | rows | Extra          | 
+----+-------------+-------+--------+-------------------------------------------------------------------------------+--------------------+---------+-----------------------------+--------+----------------------------------------------+ 
| 1 | SIMPLE  | l  | index | PRIMARY                  | FK243910AAD869E6 | 9  | NULL      | 804876 | Using index; Using temporary; Using filesort | 
| 1 | SIMPLE  | p  | ref | PRIMARY,FK4BE7532292C5D482,FK4BE75322AE503A13,FK4BE75322382D11BC,POSTING_DATE | FK4BE75322382D11BC | 9  |   l.ID    | 101 | Using index condition; Using where   | 
| 1 | SIMPLE  | af | eq_ref | PRIMARY                  | PRIMARY   | 8  |   p.fromAccount_ID |  1 | Using where         | 
| 1 | SIMPLE  | at | eq_ref | PRIMARY                  | PRIMARY   | 8  |   p.toAccount_ID |  1 | Using where         | 
+----+-------------+-------+--------+-------------------------------------------------------------------------------+--------------------+---------+-----------------------------+--------+----------------------------------------------+ 
SELECT 
     p.ID AS 'payment_id', 
     p.loan_ID AS 'loan_id', 
     l.client_ID AS 'client_ID', 
     p.amount AS 'amount', 
     p.postingDate AS 'payment_date', 
      CASE 
       WHEN af.acc_type = 'POLCH' THEN 'wallet'  
       WHEN af.acc_type = 'PLTCH' THEN 'wallet'   
       WHEN af.acc_type = 'CNTT' THEN 'bank'   
       WHEN af.acc_type = 'CNT2' THEN 'bank'   
       WHEN af.acc_type = 'KONCH' THEN 'bank'   
       WHEN af.acc_type = 'KRDTM' THEN 'cash'   
       WHEN af.acc_type = 'LDRCH' THEN 'bank'   
       ELSE concat('UNKNOWN_',af.acc_type) 
       END AS 'payment_system_type', 
     af.description AS 'payment_system' 
     FROM Posting AS p 
     INNER JOIN Account AS af ON p.fromAccount_ID = af.ID 
     INNER JOIN Account AS at ON p.toAccount_ID = at.ID 
     INNER JOIN Loan AS l ON p.loan_id = l.ID 
     WHERE ( 
      af.acc_type = 'KONCH' 
      OR af.acc_type = 'PLTCH' 
      OR af.acc_type = 'POLCH' 
      OR af.acc_type = 'KRDTM' 
      OR af.acc_type = 'LDRCH' 
      OR af.acc_type = 'CNT2' 
      OR af.acc_type = 'CNTT') 
      AND at.acc_type = 'ABON' 
      AND p.postingDate < DATE(now()) 
      AND p.ID > 0 
ORDER BY p.ID LIMIT 10000; 

貸款 - 1

發帖 - P

站長:

| Loan | CREATE TABLE `Loan` (
    `ID` bigint(20) NOT NULL AUTO_INCREMENT, 
    `amount` decimal(19,4) DEFAULT NULL, 
    `amountToReturn` decimal(19,4) DEFAULT NULL, 
    `isGivenOut` bit(1) DEFAULT b'0', 
    `isPaid` bit(1) DEFAULT NULL, 
    `issueDate` datetime DEFAULT NULL, 
    `loanPeriod` int(11) DEFAULT NULL, 
    `productType` varchar(255) DEFAULT NULL, 
    `realPayDate` datetime DEFAULT NULL, 
    `client_ID` bigint(20) DEFAULT NULL, 
    `product_ID` bigint(20) DEFAULT NULL, 
    `givenOutDate` datetime DEFAULT NULL, 
    `isPaidByBank` bit(1) DEFAULT NULL, 
    `accountNumberNBKI` varchar(255) DEFAULT NULL, 
    `needManualProcessing` bit(1) DEFAULT NULL, 
    `isReverted` bit(1) DEFAULT b'0', 
    `showInNBCHReport` bit(1) DEFAULT b'1', 
    `stake` decimal(19,5) DEFAULT NULL, 
    `ignoreProlongation` bit(1) DEFAULT b'0', 
    `stakeAfter21` decimal(19,5) DEFAULT NULL, 
    `discount_id` bigint(20) DEFAULT NULL, 
    `showInEquifaxReport` bit(1) DEFAULT b'1', 
    `ignoreNbch` bit(1) DEFAULT b'0', 
    PRIMARY KEY (`ID`), 
    KEY `FK2439106EC0BA18` (`product_ID`), 
    KEY `ISPAID_INDEX` (`isPaid`) USING BTREE, 
    KEY `ISP_ISGOUT_INDEX` (`isPaid`,`isGivenOut`), 
    KEY `ISSUEDATE_INDEX` (`issueDate`), 
    KEY `FK243910735827C6` (`discount_id`), 
    KEY `idx_Loan_realPayDate` (`realPayDate`), 
    KEY `idx_Loan_givenOutDate` (`givenOutDate`), 
    KEY `FK243910AAD869E6` (`client_ID`), 
    CONSTRAINT `_FK243910735827C6` FOREIGN KEY (`discount_id`) REFERENCES `Discount` (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=2000623399 DEFAULT CHARSET=utf8 

Posting | CREATE TABLE `Posting` (
    `ID` bigint(20) NOT NULL AUTO_INCREMENT, 
    `amount` decimal(19,4) DEFAULT NULL, 
    `postingDate` datetime DEFAULT NULL, 
    `fromAccount_ID` bigint(20) DEFAULT NULL, 
    `loan_ID` bigint(20) DEFAULT NULL, 
    `toAccount_ID` bigint(20) DEFAULT NULL, 
    `sourceType` varchar(255) DEFAULT NULL, 
    PRIMARY KEY (`ID`), 
    KEY `FK4BE7532292C5D482` (`fromAccount_ID`), 
    KEY `FK4BE75322AE503A13` (`toAccount_ID`), 
    KEY `FK4BE75322382D11BC` (`loan_ID`), 
    KEY `POSTING_DATE` (`postingDate`) USING BTREE 
) ENGINE=InnoDB AUTO_INCREMENT=230996702 DEFAULT CHARSET=utf8 

奴隸:

| Loan | CREATE TABLE `Loan` (
    `ID` bigint(20) NOT NULL AUTO_INCREMENT, 
    `amount` decimal(19,4) DEFAULT NULL, 
    `amountToReturn` decimal(19,4) DEFAULT NULL, 
    `isGivenOut` bit(1) DEFAULT b'0', 
    `isPaid` bit(1) DEFAULT NULL, 
    `issueDate` datetime DEFAULT NULL, 
    `loanPeriod` int(11) DEFAULT NULL, 
    `productType` varchar(255) DEFAULT NULL, 
    `realPayDate` datetime DEFAULT NULL, 
    `client_ID` bigint(20) DEFAULT NULL, 
    `product_ID` bigint(20) DEFAULT NULL, 
    `givenOutDate` datetime DEFAULT NULL, 
    `isPaidByBank` bit(1) DEFAULT NULL, 
    `accountNumberNBKI` varchar(255) DEFAULT NULL, 
    `needManualProcessing` bit(1) DEFAULT NULL, 
    `isReverted` bit(1) DEFAULT b'0', 
    `showInNBCHReport` bit(1) DEFAULT b'1', 
    `stake` decimal(19,5) DEFAULT NULL, 
    `ignoreProlongation` bit(1) DEFAULT b'0', 
    `stakeAfter21` decimal(19,5) DEFAULT NULL, 
    `discount_id` bigint(20) DEFAULT NULL, 
    `showInEquifaxReport` bit(1) DEFAULT b'1', 
    `ignoreNbch` bit(1) DEFAULT b'0', 
    PRIMARY KEY (`ID`), 
    KEY `FK2439106EC0BA18` (`product_ID`), 
    KEY `ISPAID_INDEX` (`isPaid`) USING BTREE, 
    KEY `ISP_ISGOUT_INDEX` (`isPaid`,`isGivenOut`), 
    KEY `ISSUEDATE_INDEX` (`issueDate`), 
    KEY `FK243910735827C6` (`discount_id`), 
    KEY `idx_Loan_realPayDate` (`realPayDate`), 
    KEY `idx_Loan_givenOutDate` (`givenOutDate`), 
    KEY `FK243910AAD869E6` (`client_ID`), 
    CONSTRAINT `_FK243910735827C6` FOREIGN KEY (`discount_id`) REFERENCES `Discount` (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=2000623399 DEFAULT CHARSET=utf8 
ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=4 

Posting | CREATE TABLE `Posting` (
    `ID` bigint(20) NOT NULL AUTO_INCREMENT, 
    `amount` decimal(19,4) DEFAULT NULL, 
    `postingDate` datetime DEFAULT NULL, 
    `fromAccount_ID` bigint(20) DEFAULT NULL, 
    `loan_ID` bigint(20) DEFAULT NULL, 
    `toAccount_ID` bigint(20) DEFAULT NULL, 
    `sourceType` varchar(255) DEFAULT NULL, 
    PRIMARY KEY (`ID`), 
    KEY `FK4BE7532292C5D482` (`fromAccount_ID`), 
    KEY `FK4BE75322AE503A13` (`toAccount_ID`), 
    KEY `FK4BE75322382D11BC` (`loan_ID`), 
    KEY `POSTING_DATE` (`postingDate`) USING BTREE 
) ENGINE=InnoDB AUTO_INCREMENT=230996702 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=4 

如果從查詢

 
+----+-------------+-------+--------+------------------------------------------------------------+---------+---------+-----------------------------+-----------+-------------+ 
| id | select_type | table | type | possible_keys            | key  | key_len | ref       | rows  | Extra  | 
+----+-------------+-------+--------+------------------------------------------------------------+---------+---------+-----------------------------+-----------+-------------+ 
| 1 | SIMPLE  | p  | range | PRIMARY,FK4BE7532292C5D482,FK4BE75322AE503A13,POSTING_DATE | PRIMARY | 8  | NULL      | 107736559 | Using where | 
| 1 | SIMPLE  | af | eq_ref | PRIMARY             | PRIMARY | 8  | smsfinance.p.fromAccount_ID |   1 | Using where | 
| 1 | SIMPLE  | at | eq_ref | PRIMARY             | PRIMARY | 8  | smsfinance.p.toAccount_ID |   1 | Using where | 
+----+-------------+-------+--------+------------------------------------------------------------+---------+---------+-----------------------------+-----------+-------------+ 

刪除表貸款,如果我想補充 創建帳戶(acc_type)指數ACC;

計劃:

 
+----+-------------+-------+--------+-------------------------------------------------------------------------------+--------------------+---------+---------------------------+------+--------------------------------------------------------+ 
| id | select_type | table | type | possible_keys                 | key    | key_len | ref      | rows | Extra             | 
+----+-------------+-------+--------+-------------------------------------------------------------------------------+--------------------+---------+---------------------------+------+--------------------------------------------------------+ 
| 1 | SIMPLE  | af | range | PRIMARY,acc                 | acc    | 21  | NULL      | 4192 | Using index condition; Using temporary; Using filesort | 
| 1 | SIMPLE  | p  | ref | PRIMARY,FK4BE7532292C5D482,FK4BE75322AE503A13,FK4BE75322382D11BC,POSTING_DATE | FK4BE7532292C5D482 | 9  | smsfinance.af.ID   | 54 | Using index condition; Using where      | 
| 1 | SIMPLE  | l  | eq_ref | PRIMARY                  | PRIMARY   | 8  | smsfinance.p.loan_ID  | 1 | NULL             | 
| 1 | SIMPLE  | at | eq_ref | PRIMARY,acc                 | PRIMARY   | 8  | smsfinance.p.toAccount_ID | 1 | Using where           | 
+----+-------------+-------+--------+-------------------------------------------------------------------------------+--------------------+---------+---------------------------+------+--------------------------------------------------------+ 

查詢執行很長一段時間。

+0

這可能會發生很多原因。請爲'l'和'p'提供'SHOW CREATE TABLE',加上有問題的查詢。我懷疑壓縮是否相關。 mysqls是什麼版本? –

+0

編輯主帖子。 – unknown

回答

0

我懷疑壓縮導致不同的統計數據,這可能導致不同的執行計劃。我在這個查詢中看不到Loan表。從查詢中刪除它可能會強制解釋計劃是相同的。

你在每個表中有200M行嗎?另一個加速將是縮小表格。

  • 變化BIGINT(每8個字節),以INT UNSIGNED(4個字節,範圍0..4十億)儘可能。
  • _type列標準化,替換爲SMALLINT UNSIGNED(2個字節,範圍0..64K)或其他合適的整數類型。如果存在有限的少量「類型」,則將列轉爲ENUM

請問Account有沒有INDEX(acc_type)? (或者至少開始與acc_type。)

(SELECT client_ID FROM Loans WHERE ID = p.loan_id) AS 'client_ID', 

刪除INNER JOIN Loan AS l ON p.loan_id = l.ID並更換l.client_ID AS 'client_ID',我認爲這將迫使不同的查詢計劃,或許是一個好。

+0

對不起,我在查詢中犯了錯誤。現在表貸款存在於查詢中。 – unknown

+0

不,帳戶具有acc_type和client_ID'索引'UNIQUE KEY'idx_unique_client_acc_type'('client_ID','acc_type')' – unknown

+0

我需要一個帶有acc_type的索引_starting_。 –