1.查询重写技术
1 不要引用索引列在一个表达式。这样将阻止使用索引列。代替是应该在比较的边使用尽可能的。加入一个表t包含一个date d列。 如下
select * from t where year>=1884代替使用select * from t where d>='1994-01-01';
2.索引是特别有用的对于连接比较两个表中的列如下:
select* from country,countrylanguage
where country.code=countrylanguage.countrycode;
3.当使用索引是采用和列相同的数据类型
where id=18
where id='18'
4.在某种情况下,可以使用模式匹配,开始是字母时很有效
23.3.2 使用explain来获得优化信息
explain select* from t where year >=1994\G
explain select* from t where d>='1994-o1-01'\G可以看到减少了查询了行
22.3.3 优化查询通过限制输出
limit限制输出
对于特别大的表如果要取出几行,使用limit并不能达到很好的效果。使用where很好
22.3.4 使用summary表
22.3.5 优化更新
1.尽量使用where语句,在比较时使用索引
2.explain被使用select查询,但是你可能发现它是有用分析update和delete语句。
3.使用多行的插入代替多个单行的插入
如果你正在使用InnoDB表,你可以得到更好的性能通过分组他们在一个transaction而不是执行他们自动提交
4.对于存储引擎,load data infile是更快比多行插入
5.可以disable index,当加载元素进入一个空的myisam表时来加速操作。
6.为了替代存在的行,使用replace而不是delete+insert
22.4 选择恰当的存储引擎
当创建一个表时,询问你自己那种类型的查询你正在使用。任何选择一个存储引擎。当需要处理查询和很多更新是使用INNoDB引擎。如果你正在使用MyISAM表,选择他们的结构来反映是否你考虑处理速度的效率或磁盘的使用率。不同的MYISAM存储跟上有不同的性能的特征。这影响你选择固定长度或可变长度的列来存储字符数据:
1.使用固定的列入(CHAR,Binary)为了更好的加速
2.使用可变长度的列入(varchar,varvinary text ,blob)为了更好使用磁盘空间。
另外使用MyISAM引擎的表被用来使用压缩的可读表。
对于INnodb,它是也是正确的使用Char列将花费更多的存储空间比varchar。但是没有额外的加速相比MyISAM,因为InnoDB引擎的实现存储对于char和varchar是相似的。
MeRGE表能够使用压缩和非压缩表的混合。这能偶使有用的对于基于时间纪录的。例如,你例如日志纪录,对于当前年的表可以使用非压缩的表,对于以前的日志使用压缩表。如果创建merge表来自collection,可以很容查询所有的表。
他将多个表在逻辑上当作一个表来查询。他建立后有两个文件,
.frm 表结构定义
.mrg union表的名字清单
两个基本表:
CREATE TABLE TEST_MERGE_1(
ID INT(5) NOT NULL,
VALUE VARCHAR(100) NOT NULL,
PRIMARY KEY(ID)
)
CREATE TABLE TEST_MERGE_2(
ID INT(5) NOT NULL,
VALUE VARCHAR(100) NOT NULL,
PRIMARY KEY(ID)
)
MERGE表的建立:
CREATE TABLE TEST_MERGE(
ID INT(5) NOT NULL,
VALUE VARCHAR(100) NOT NULL,
PRIMARY KEY(ID)
) TYPE=MERGE UNION=(TEST_MERGE_1,TEST_MERGE_2) INSERT_METHOD=LAST;
1. 此表类似于SQL中的union机制。
2. 此表结构必须与基本表完全一致,包括列名、顺序。UNION表必须同属一个DATABASE。
3. 基本表类型必须是MyISAM。
4. 可以通过修改.mrg文件来修改MERGE表,每个基本表的名字占一行。注意:修改后要通过FLUSH TABLES刷新表缓存。
5. 对基本表的更改可以直接反映在此表上。
6. INSERT_METHOD的取值可以是: 0 不允许插入 FIRST 插入到UNION中的第一个表 LAST 插入到UNION中的最后一个表。(4.0之后可用)
7. 定义在它上面的约束没有任何作用,约束是由基本表控制的,例如两个基本表中存在着同样的一个Key值,那么在MERGE表中会有两个一样的Key值。