索引
目的:提高数据查询效率
实现:常见的有哈希表、有序数组、搜索树
哈希表:新增内容很快,但做区间查询很慢,适用于等值查询的场景。
有序数组:对等值查询和范围查询速度都很快,但更新数据很慢,只适用于静态存储引擎。
查询效率
count(字段)<count(主键 id)<count(1)≈count(*),建议尽量使用 count(*)
案例一:条件字段函数操作
对索引字段做函数操作,可能会破坏索引值的有序性,因此优化器就决定放弃走树搜索功能。
案例二:隐式类型转换
如果比较的字符的类型不同,解释器会自动转换类型,这时可能就会发生案例一的情况,
看 select “10” > 9 的结果:如果规则是“将字符串转成数字”,那么就是做数字比较,结果应该是 1;如果规则是“将数字转成字符串”,那么就是做字符串比较,结果应该是 0。
案例三:隐式字符编码转换
如果比较的字符的编码凡事不同,解释器会自动转换编码,这时可能就会发生案例一的情况,
慢查询性能问题
MySQL 中,会引发性能问题的慢查询,大体有以下三种可能:
- 索引没有设计好,通过创建索引来解决;
- SQL 语句没写好,参考上面的案例;
- MySQL 选错了索引,给这个语句加上 force index。
join语句
总是应该使用小表做驱动表,在决定哪个表做驱动表的时候,应该是两个表按照各自的条件过滤,过滤完成之后,计算参与 join 的各个字段的总数据量,数据量小的那个表,就是“小表”,应该作为驱动表。