2013-10-08 102 views
1

我的數據庫表如下在mysql中提高查詢性能

|id|code|qn1|qn2|qn3|qn4|qn5|.............|qn38|qn39|qn40|name|modfiedDate|status|RollNo| 

我試圖優化查詢從該表

我需要找到選定unanswerd問題和選項的數量抓取詳情選擇用於問題QN1保持值1

查詢

:對於這個問題我目前

前查看

select * from tbl_name where code ='xx' and RollNo ='123'; 

視圖頁面顯示的每次一個問題,我需要的總懸而未決的問題,並有大量的點擊

有對問題的完全40場的某個時候可能只有22問題

所以此查詢是否可以提高性能

$field_str=""; 
for($no=1;$no<=$TotalQ_count;$no++) 
{ 
    $field_str .= ",qn".$no; 
} 

$field_str =ltrim($field_str,","); 

$querycnt = "SELECT status, $field_str from tbl_name 
where code ='xx' and RollNo ='123' "; 

是否有任何其他方式可以改善此查詢?

回答

1

你應該創建另一個數據庫結構。類似的東西:

表 「測試

id|date|some_other_columns... 

和表 「問題

id|test_id|answer|date|some_other_columns 

然後你就可以輕鬆地查詢:

SELECT 
    COUNT(*) AS `unanswered_questions` 
FROM `tests` 
INNER JOIN `questions` 
    ON `tests`.`id` = `questions`.`test_id` 
WHERE 1 
     AND `tests`.`id` = 5 
     AND `questions`.`answer` IS NOT NULL 
+0

一個問題,將從'select * fro改變查詢m tbl_name'到'select tbl_name'中的almost_all_fields減少服務器上的負載? –

+0

當然,你應該只抓取你需要的那些列。這將有助於提高查詢的性能。 –

+0

我正在考慮開銷,MYSQL是否獲取所有行,然後剝離並返回僅需要的字段,或者僅獲取必填字段 –