这段时间开会讨论数据访问时间优化的瓶颈和方案,邮件访问操作还是有点慢尽可能再优化,我们组新来的大牛测试和mysql之间的数据交互时间长可以继续优化,猜测当初的mysql设计貌似只考虑了前端开发方便而忽略了后台的性能,这里提到了些mysql的 索引设计、视图、触发器 听得我值犯迷糊 今天把这些东西补一补 以后就可以听懂了:
索引的设计和应用:
为test表创建一个4字节的前缀索引:create index indexname on test (name(4));
测试查询:
explain select * from test where username="lyy" \G;
删除索引:
drop index indexname on test;
索引建立是在select后面的where条件列,且重复值越小(基数越大)索引效果越好,最好是建立短索引(前缀/后缀n个字节),不要建立过多索引会影响:索引结构更新 mysql优化 读写 磁盘占用。
hash索引:只适用于=或者>= 、<=操作符的比较
btree索引:<、>、<=、>=、<>、!=、 between 或者like 'pattern'(正则匹配)
索引查询:
适合btree和hash
select * from test where mid=1 or mid in (10,18,25);
只适合btree
select * from test where mid>1 and mid<10;
select * from test where mid like 'ab%' or mid between 'lisa' and 'simon';
视图:
过滤好的复合条件的结果集。
创建:(聚合、常量、子函数试图是不能更新的)
> create or replace view view_name as
>select test.name, test.password, test1.sal from test,test1 where test.name=test1.name;
with()check option限定条件:
(1)双层视图
> create or replace view ivew_name as
> select name,passwd from test where id < 10 with check option;
(2)
> create or replace view view_name1 as
> select name,passwd from view_name where id < 5 with local check option;
(3)
> create or repalce view view_name2 as
> select name,passwd from view_name where id < 5 with caseaded check option;
update view_name1 set id = 10 where id=3; //成功 with local check option只要满足本视图条件即可
update view_name2 set id=10 where id =3; //失败 with caseaded check option 要满足所有相关视图才行
删除:
drop view view_name;
查看视图详细信息:
show table status like 'view_name' \G;
show create view view_name \G;
触发器:
创建触发器:
create trigger trigger_name trigger_time trigger_event on tbl_name for each row trigger_stml:
trigger_time:after和befor
trigger_event:触发事件 insert update delete
delimiter $$
create trigger trigger_name after insert on test for each row begin insert into trig_test (name,passwd, sal) values(new.name, new.passwd, 1new.sal);
end ;
$$
delimiter;
数据插入test时候也会像trig_test插入一条;
对于触发器来说:如果源数据是insert 触发器表中如果有该数据则执行更新update操作,如果没有直接插入; 如果设定了after insert、before insert、after update、befor update 则:如果数据源insert 触发器表中如果有该数据则执行更新update操作(before insert --> before update --> after update 这样一个过程),如果没有直接插入(befor insert-->after insert) 设置触发器时候应注意 他是按照 before触发器-->行操作-->after触发器顺序执行的
删除:
drop trigger trigger_name;
查看状态:
show triggers \G
desc triggers;
select * from triggers where trigger_name='triggername' \G;