2013-10-08 69 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是否获取所有行,然后剥离并返回仅需要的字段,或者仅获取必填字段 –