MySql sql 常用优化点
1.查找优化点:查看sql语句的执行计划
比如 explain select * from tbl_user where id=1
id | select_type|table|type|possible_kes|key|key_len|ref|rows|Extra
1|SIMPLE|tbl_user|const|PRIMARY|PRIMARY|4|const|1|null
简单解释:
id:select操作表的顺序,顺序从大到依次执行.
select_type :选择的类型,如: SIMPLE(简单的)
type :访问类型。ALL(全表扫描),index(索引扫描),range(范围扫描),
ref (非唯一索引扫描),eq_ref(唯一索引扫描),const(常数引用) 速度依次由慢到快。
table :查询的表
possible_keys :查询语句,可能走的索引(不一定是真实的)。
key :显示MySQL实际使用的索引,包括主键索引,或者自建索引的名字。
key_len :索引所使用的字节数
ref :连接匹配条件,若走主键索引值为const, 全表扫描为null值
rows :扫描行数,通常情况下,rows越小,效率越高, 这是优化点。
Extra:包含执行SQL时的真实情况,比如”using where”,表示使用where筛选得到的值
2.建索引注意点
(1)选择区分度很高的列上见索引。
参考:(公式 q=count(distinct(column)/count(*), 0<=q<=1,q=1最合适建索引))
(2)联合索引(多列建立索引) 比如 alter table tbl_user add index idx_uname_phone(uname,phone);
(2-1)最左前缀匹配原则: MySQL会一直向右匹配直到遇到范围查询(>、
如 select * from tbl_user where uanme='xiariwa' and createdate
由于出现了
(2-2)函数运算:在索引列上进行函数运算,索引会失效.
3.常见优化场景
(1)主键连续,改limit查询为范围查询。
如 limit 10000,100 改成between 100000 and 1000100;
(2)防止数据类型隐式转换。将参数值改成与表中列数据类型一致。
phone 数据库保存的是char类型,而传入的是数字,应该这样转换,才会走索引 select * from tbl_user where phone=cast(13819831231 as char);;