加载中...

(23)索引和查询优化


索引和查询优化

在MySQL中, 有四种类型的索引, 主键, 唯一索引, 全文索引和普通索引

主键(Primary Key)就是值唯一并且没有值为NULL的域的索引

  • 主键不能包含NULL
  1. #创建表, 并设置主键
  2. mysql> create table pk_test(
  3. -> f1 int not NULL,
  4. -> primary key(f1));
  5. #已存在的表上创建主键, 语法: alter table tablename add primary key(fieldname1 [, fieldname2])
  6. mysql> alter table customer modify id int not null, add primary key(id);

普通索引容许重复的值

  1. #创建普通索引语法 mysql> create table(fieldname columntype, fieldname2 columntype, index[indexname](fieldname1 [,fieldname2...]));
  2. #创建后添加索引: alter table tablename add index[indexname](fieldname1 [,fieldname2...]);
  3. mysql> alter table sales add index(value);

全文索引

  1. #创建全文索引语法 mysql> create table(fieldname columntype, fieldname2 columntype, fulltext[indexname](fieldname1 [,fieldname2...]));
  2. mysql> insert into ft2 values
  3. -> ('Waiting for the barbarians'),
  4. -> ('In the Heart of the Country'),
  5. -> ('The master of Patersbury'),
  6. -> ('Writing and Being'),
  7. -> ('Heart of the Beast');
  8. -> ('Heart of the Beest'),
  9. -> ('The beginning and the End'),
  10. -> ('Master Master'),
  11. -> ('A barBarian at my door');
  12. Query OK, 4 rows affected (0.00 sec)
  13. #创建表后再添加全文索引:alter table tablename add fulltext[indexname](fieldname1 [,fieldname2...]);
  14. mysql> create table ft(f1 varchar(255), f2 text, f3 blob, f4 int);
  15. mysql> alter table ft add fulltext(f1, f2);

全文索引的用法

文本域查找与大小写无关

  1. # match()匹配属性, against()匹配值
  2. mysql> select * from ft2 where match(f1) against ('master');

唯一索引除了不容许有重复的记录外, 与普通索引一样

  1. #创建普通索引语法 mysql> create table(fieldname columntype, fieldname2 columntype, unique(fieldname1 [,fieldname2...]));
  2. mysql> create table ui_test(f1 int, f2 int, unique(f1));
  3. mysql> insert into ui_test values(1, 2);
  4. #f1域不能包含重复值
  5. mysql> insert into ui_test values(1, 3);
  6. ERROR 1062 (23000): Duplicate entry '1' for key 'f1'
  7. #创建后添加索引: alter table tablename add unique[indexname](fieldname1 [,fieldname2...]);

删除或者改变索引

  1. #删除主键
  2. alter table tablename drop primary key;
  3. #删除普通, 唯一, 全文索引, 需要制定索引名
  4. alter table tablename frop index indexname;
  5. #显示全部索引名
  6. show keys from tablename;

选择索引

  • 有查找需要使用索引的时候, 考虑创建索引
  • 创建索引返回的行越少越好
  • 私用短索引
  • 不要创建太多的索引

还没有评论.