常识:

mysql 编辑的字段类型是 字符长度
utf-8  1个字符=3个字节    1个字节=8个位
一个英文字母字符存储需要1个字节

1.MySQL 表的优化和列类型选择

表的优化
   1.定长和变长,常用核心字段可以用char,不常用可以用varchar,而varchar,text,blob这种变长的字段,适合放一张表,用主键与核心表关联利用空间提高查询效率
   2.常用字段和不常用字段用表区分
   3.对于联合查询统计之类的,可以在表添加冗余字段的方式提交查询效率
   
   
   列的使用原则
   1.字段类型优先级:整型>date,time>enum,char>varchar>blob,text
   2.够用就好,不要慷慨(如smallint,varchar(N))
   3.避免用NULl
   5.避免用enum,列enum('男','女'),这个保存是要转化成,1或0,多了转化步骤,可以直接用tinyint(1个字符,3个utf8字节,最大可存255)

2.MySQL索引优化

1.只有搜索引擎是memory,才会用bash索引,hash算法是很容易找到数据,找到的结果是1或0,但是hash不能用于排序,hash索引很快找到数据的原因是,hash索引是直接保存在磁盘中指定的位置[指定的位置是经过hash算法直接计算出来]

2.btree索引主要用在其余的搜索引擎中,
myIsam-搜索引擎的数据有三个文件,MYD-数据文件,MYI-索引文件,FRM-数据结构文件
Innodb-搜索引勤的数据有两个而文件,IDB-索引和数据文件,FRM-数据结构文件
myIsam和innodb,文件的区别,主要是innodb的的数据是保存在索引树下,索引树下就是对应的数据,而myisam,查询是的时候则需要到索引文件找索引,之后需要回调到磁盘中找数据。

聚簇索引与非聚簇索引
  myisam 索引与数据的关系,myisam索引指向行在磁盘上的位置,
  innodb  索引与数据的关系,innodb直接在主键索引树中,直接存储行的数据

   innodb:
    1.主键索引,即存储索引值,又会在叶子中存储行的数据
    2.若果没有主键(PRIMARY),则会Unique key 主键
    3.若果没有Unique,则系统生成一个内部的rowid做主键
    4.在innodb中,主键的索引结构中,即存储了主键值,又存储了行数据,这种结构称为“聚簇索引”

3.适当的利用联合索引

3.索引覆盖

索引覆盖指的是,如果查询的列是索引的一部分,那么查询只需要在索引文件上进行,不需要回行到磁盘再查找数据【查询数据涉及到回行到磁盘上查询数据,查询效率会立刻慢下来】,这种查询速度非常快,称为“索引覆盖”

4.理想索引

1.查询频繁  
2.区分度高  
3.长度小 
4.尽量能覆盖常用查询字段
索引的长度会直接影响索引文件的大小,影响增删改查的速度,并直接影响查询的速度(占用内存多)

针对列中的值,从左往右截取部分,来建索引
1.截取越短,重复读越高,区分度越小,索引效果越不好
2.截取越长,重复度越低,区分度越高,索引效果越好,但带来的影响也越大,增删改变慢,并影响查询速度。
区分度+长度 两者取一个平衡做索引

列子:
select count(distinct left(word,6)/count()) from dict 截取word字段的6个字符,做区分度的统计
select count(distinct left(word,6)) from dict / select count(
) from dict

2.伪hash索引效果
将需要做索引的内容做hash处理,然后把hash处理后的内容新建一个字段做索引; 这样就降低的重复度,提高了区分度
例子:http://www.baidu.com 保存网址的字段前面是很多重复的,然后做hash算法处理,crc32(url)算出来的值,保存新建一个字段做索引;

4.索引与排序
5.重复索引与荣誉索引