(有时候MySQL比较傻,所以你得会使用FORCE INDEX)。
select * from t
FORCE INDEX(rid)
where ,,,
/// 多个 char(255)
对于 有些字符串需求,长度超过了char(255), 使用 text 又浪费,可以使用两个char(255),速度快了吧
// 显示有哪些索引
SHOW INDEX FROM db.table
------------------------------------------------
【架构】
1. 字段类型精确设置,
2. 表链接 查询时的对比字段类型需要一致,长度 也要一致,比如,都是char(16),char(16)
3. 排序,大偏移量,,先读取主键,然后根据主键取需要的字段 数据
4. mysql 一次执行职能使用一个索引,注意需要排序的字段和其他有索引的字段 语句设计
5. memory表 使用hash索引,hash 索引仅支持 “=”,“IN”,“<=>” 条件,不能排序
【程序】
以下理论都不是绝对的,而是开发初期应该做的,到了开发后期,出现性能问题的时候,要根据实际情况决定哪个更合适
1. 请求了不必要的字段
2. 有必要使用limit
3. 没特殊必要,都用简单的select 查询语句取数据,不要多表链接查询,,不放心可以在开发完成后进行测试,链表是否更好
4. 减少服务器请求次数,(和第三条貌似有些矛盾,没关系,因地制宜)
5. 不要用子查询,
6. 不要一次性让数据库处理太多 curd操作,要产生时间间隔 分批次执行,
7. count(*)
8. limit 优化
select * from t limit 99999,20;
改成 select * from t where id> (select id from t limit 99998,1) limit 20;
对于分页,如果每页需要数据 20条,那么取21,最后一个的id就可以用于下一页使用,而不必再使用 子查询
x. 网上搜到,下面情况会使索引失效:没有实际测试过在什么情况会失效,反正避免使用它们吧
1.对索引列进行进行 计算 或用 函数 加以处理时
2.两边比较值的索引列的数据类型不一致时
3.not in ,or 关键字会使索引失效
4.含有null列值的列,即使该列是组合索引中的其中一列
5.任何where子句中含有IS NULL ,IS NOT NULL
6.like 中首个关键字符是通配符时,如:'%haitao%'
7.order by子句中:
使用表达式时;
对不同的索引键做 ORDER BY : SELECT * FROM t1 ORDER BY key1, key2; 。
用于搜索记录的索引键和做 ORDER BY 的不是同一个:SELECT * FROM t1 WHERE key2=constant ORDER BY key1;
emp_no<'10010' 范围列可以用到索引(必须是最左前缀),但是范围列后面的列无法用到索引。同时,索引最多用于一个范围列,因此如果查询条件中有两个范围列则无法全用到索引。
很多需要实际看数据使用情况,比如,多列索引的最左前缀使用,
总结之:sql语句里,不用 函数,or, null,like, ,其他是设计数据库的问题
不要轻易相信网上说的一切,有性能问题的时候,explain 你的sql,还有 mysql> set profiling=1, 才是真的,
【服务器】
查询缓存,
缓存可能因大量碎片,内存不足,数据改变 导致失效,
如果已经分配了足够的内存,query_cache_min_res_unit 也调整到了合适值,
那就是数据改变过多引起的,可以查看Com_*(com_update,com_delete)的值看有多少查询被修改了,
Qcache_lowmem_prunes -- 因内存不足而失效的查询
query_cache_type 是否开启 查询缓存
query_cache_size 分配的内存大小,必须是1024的倍数
query_cache_limit 查询结果集最大限制,如果查询结果比这个大,将不缓存,如果确认某个sql语句 是这样,语句加上 sql_no_cache 提供性能
优化缓存的大原则:
减少碎片
提高可用性
query_cache_min_res_unit 一个内存和cpu较量的参数
Qcache_free_blocks
如果Qcache_free_blocks接近Qcache_total_blocks的一半,说明查询cache碎片很严重
可以使用FLUSH QUERY CACHE命令来去掉查询cache中的碎片,他不会将cache的结果删除,那是RESET QUERY CACHE的工作
-------------------
show variables like '%slow%';
show global variables;
--------补充
varchar类型并不是不能超过255长度(实际上是65535字节),而是超过了255,这个字段就不能建立索引了。
在MySQL5.0.3及以上的版本中,varchar数据类型的长度支持到了65535,也就是说可以存放65532个字节的数据,起始位和结束位占去 了3个字节,也就是说,在5.0.3以下版本中需要使用固定的TEXT或BLOB格式存放的数据可以在高版本中使用可变长的varchar来存放,这样就 能有效的减少数据库文件的大小