六、SQL最適化

2794 ワード

SQLの最適化
ポリシーの最適化
一、できるだけ全値一致
インデックス列が作成されたら、where条件でできるだけすべてのインデックスを使用します.
CREATE TABLE `staffs`(
    id int primary key auto_increment,
    name varchar(24) not null default "" comment'  ',
    age int not null default 0 comment '  ',
    pos varchar(20) not null default ""  comment'  ',
    add_time timestamp not null default current_timestamp comment '    '
    )charset utf8 comment '     ';
 
    
insert into staffs(name,age,pos,add_time) values('z3',22,'manage',now());
insert into staffs(name,age,pos,add_time) values('july',23,'dev',now());
insert into staffs(name,age,pos,add_time) values('2000',23,'dev',now());
 
alter table staffs add index idx_staffs_nameAgePos(name,age,pos);

EXPLAIN SELECT * FROM staffs WHERE NAME = 'July';
EXPLAIN SELECT * FROM staffs WHERE NAME = 'July' AND age = 25;
EXPLAIN SELECT * FROM staffs WHERE NAME = 'July' AND age = 25 AND pos = 'dev'
二、最適な左接頭辞法則
複数のカラムがインデックスされている場合は、左端の接頭辞の法則を守ります.クエリがインデックスの左端から始まり、インデックス内のカラムをスキップしないことを意味します.
EXPLAIN SELECT * FROM staffs WHERE  age = 25 AND pos = 'dev'
EXPLAIN SELECT * FROM staffs WHERE pos = 'dev'
EXPLAIN SELECT * FROM staffs WHERE NAME = 'July' 
   SQL       NAME    ,         
三、インデックス列の上に何もしない
インデックス列に操作(計算、関数、(自動or手動)タイプ変換を行わないと、インデックスが失効して全テーブルスキャンに移行します.
四、範囲条件を最後に置く
中間範囲クエリーでは、後続のインデックス列がすべて無効になります.
EXPLAIN SELECT * FROM staffs WHERE NAME = 'July' and age >22 and pos='manager'
五、できるだけインデックスを上書きする
インデックスの上書き、すなわちインデックスのみにアクセスするクエリー(インデックス列とクエリー列が一致する)をできるだけ使用し、select*の使用を減らします.
EXPLAIN SELECT * FROM staffs WHERE NAME = 'July' and age =22 and pos='manager'
EXPLAIN SELECT name,age,pos FROM staffs WHERE NAME = 'July' and age =22 and pos='manager'
六、慎重に使うのと同じではない
mysqlが等しくない(!=または<>)を使用している間にインデックスを使用できないと、テーブル全体がスキャンされます.
解決方法:索引の上書き
七、フィールドのNULLとNOT NULL
フィールドがnot nullの場合、is nullまたはis not nullを使用するとインデックスが無効になります.
EXPLAIN select * from staffs where name is null
EXPLAIN select * from staffs where name is not null
フィールドがnullの場合、is not nullを使用するとインデックスが無効になります.
解決方法:索引の上書き
八、Likeクエリーは気をつけて
likeがワイルドカードで始まる('%abc...')mysqlインデックスが無効になると、全テーブルスキャンの操作になります.
解決方法:索引の上書き
EXPLAIN select name,age,pos from staffs where name like '%july%'
九、文字タイプに引用符を付ける
文字タイプには必ず引用符を付けてください
十、orをunionに変える効率が高い
EXPLAIN select * from staffs where name='July' or name = 'z3'
EXPLAIN
select * from staffs where name='July'
UNION
select * from staffs where name = 'z3'