1

次の テーブルが あり ます
。 オプション:- 1 つのオプション:結合を使用して学生のすべての詳細を取得するクエリ:-









select s.name, sd.city, sc.className
from student as s join student_address sd on s.addId = sd.addId 
inner join student_class sc on sc.classId = s.classId 
inner join student_hobby sh on sh.stuId = s.stuId
where sh.hobby REGEXP 'cricket|footbal';


別のオプションは、ストアド関数を使用しています:

select s.name, sd.city, sc.className
from student as s join student_address sd on s.addId = sd.addId 
inner join student_class sc on sc.classId = s.classId 
where f_searchHobby(s.stuId,'cricket|footbal')=1;


create function f_searchHobby( 
sId int,
matches varchar(100)
 ) returns int 
begin
 select count(*) into @count from student_hobby where hobby regexp matches and stuId = sId;
 if @count > 1 then
  return 1 ;
 else 
  return 0; 
 end if; 
end



両方の結果が結果セットを取得していると考えてください。
ですから、重いデータベースに適したアプローチを提案させてください。


ありがとう、

4

1 に答える 1

0

必要なストアド関数の例では、外側のクエリの各行に対してSELECT COUNT(*)クエリを実行します。これは相関サブクエリと同等であり、パフォーマンスが大幅に低下します。

あなたがすべきREGEXPの例も悪いですが、ストアド関数ほど悪くはありません。REGEXP はインデックスを使用できません。常にテーブル スキャンが必要で、テーブルのすべての行に式を適用します。

表示する検索でIN( )述語を使用することをお勧めします。

select s.name, sd.city, sc.className
from student as s join student_address sd on s.addId = sd.addId 
inner join student_class sc on sc.classId = s.classId 
inner join student_hobby sh on sh.stuId = s.stuId
where sh.hobby IN ('cricket', 'footbal');

これは、各趣味が別々の行に個別に格納されていることを前提としています。

趣味のリストを 1 行の文字列に格納する場合は、FULLTEXT インデックスを使用する必要があります。

select s.name, sd.city, sc.className
from student as s join student_address sd on s.addId = sd.addId 
inner join student_class sc on sc.classId = s.classId 
inner join student_hobby sh on sh.stuId = s.stuId
where MATCH(sh.hobby) AGAINST ('cricket footbal' IN BOOLEAN MODE);
于 2013-08-31T07:31:14.963 に答える