0

クエリの実行でいくつかの問題に直面しています。これが私の場合です:

20万レコードのログと6万レコードのログレコードの2つのテーブルがあります

ログ テーブルの単一のログ レコードがlogrecords テーブルに複数のログ メッセージを持つことができる場合、私のデータベース スキーマは次のとおりです。

ログテーブル

CREATE TABLE `log` (                           
       `logid` varchar(50) NOT NULL DEFAULT '',         
       `creationtime` bigint(20) DEFAULT NULL,            
       `serviceInitiatorID` varchar(50) DEFAULT NULL,   
       PRIMARY KEY (`logid`),                           
       KEY `idx_creationtime_wsc_log` (`creationtime`)  
     ) ENGINE=InnoDB DEFAULT CHARSET=latin1

およびlogrecordsテーブル

CREATE TABLE `logrecords` (                                                 
              `logrecordid` varchar(50) NOT NULL DEFAULT '',                                
              `timestamp` bigint(20) DEFAULT NULL,                                          
              `message` varchar(8000) DEFAULT NULL,                                         
              `loglevel` int(11) DEFAULT NULL,                                              
              `logid` varchar(50) DEFAULT NULL,                                             
              `indexcolumn` int(11) DEFAULT NULL,                                           
              PRIMARY KEY (`logrecordid`),                                                  
              KEY `indx_logrecordid_message_logid` (`logrecordid`,`message`(767),`logid`),  
              KEY `logid` (`logid`),                                                        
              KEY `indx_message` (`message`(767))                                           
            ) ENGINE=InnoDB DEFAULT CHARSET=latin1    

休止状態によって作成されたクエリは次のようになります

select this_.logid as logid4_1_, this_.loglevel as loglevel4_1_, this_.creationtime as creation3_4_1_,this_.serviceInitiatorID as service17_4_1_, this_.logtype as logtype4_1_,logrecord1_.logrecordid as logrecor1_3_0_, logrecord1_.timestamp as timestamp3_0_, logrecord1_.message as message3_0_, logrecord1_.loglevel as loglevel3_0_, logrecord1_.logid as logid3_0_, logrecord1_.indexcolumn as indexcol6_3_0_ from log this_ inner join wsc_logrecords logrecord1_ on this_.logid=logrecord1_.logid where (1=1) and (1=1) and logrecord1_.message like 'SecondMessage' order by this_.creationtime desc limit 25

実行に約7313ミリ秒かかります

クエリ説明は次のようなものです

ここに画像の説明を入力

しかし、以下のクエリを実行すると、実行に約15分かかります

select count(*) as y0_ from log this_ inner join logrecords logrecord1_ on this_.logid=logrecord1_.logid where (1=1) and (1=1) and lower(logrecord1_.message) like 'SecondMessage' order by this_.creationtime desc limit 25

上記のクエリの説明は次のようになります ここに画像の説明を入力

私はMySQlデータベースを使用しています。インデックス作成または特定できないその他の問題があると思います

どんな解決策でも大歓迎です。

4

1 に答える 1

0

lower(logrecord1_.message) like 'SecondMessage'プレーンの代わりに使用するとlogrecord1_.message like 'SecondMessage'、DB エンジンは のインデックスの使用を停止しますlogrecord1_.message

lower(logrecord1_.message)の代わりにを持つ関数ベースのインデックスを作成することで、これを克服できますlogrecord1_.message

于 2013-04-08T14:19:21.707 に答える