- Mysql单进程多线程设计。
-
InnoDB优点
- 5.5以后默认引擎
- 行级锁
- 支持事物
- 更好的恢复性
- 高并发下性能更好,对多核、大内存、ssd等硬件支持好。
-
mysql的InnoDB采用的索引算法
B+树
B+树索引
-
聚集索引
一个表只有一个聚集索引,根据主键生成(如果设置主键),图中红色
一个叶子节点存放整行记录 -
二级索引(辅助索引)
非聚集索引都是二级索引,如果非主键查询,会先根据二级索引找到主键,在根据聚集索引中查找数据。图中蓝色。
一个叶子节点存放主键 -
没有索引就会进行全表扫描。
-
索引是一切快速查询的前提。
-
索引可以提供效率,但也会降低插入和更新的速度并占有磁盘空间。
-
单张表索引数量不要超过5个,
-
单个索引中的字段数不超过5个
索引操作
- 查看表的索引
show index from 表名 mysql查看表索引
Sql优化案例
案例一
-
在sql查询中=号左边使用表达式,会放弃索引
image.png -
查看语句执行计划
explain extended sql语句
* 第一个语句扫描了6行,using index,使用了索引,第二个扫描了70多万行,没有使用索引。
案例二
- machine_vc字段是varchar类型,查询时如果使用数字,mysql会将两边转换成浮点数进行比较(隐式转换),会放弃索引。
- 为什么会放弃?machine_vc是字符串,假如“1142”、“1142@d”、“1142.00”是machinde_vc的值,因为不能确定是否只有“1142”能满足等于1142的要求,所以它会扫描全表,逐个比较,这时就不会使用B+树索引。
- 第一个语句查询6行,第二个查询70多万行。
案例三
image.png- 查询偏移量80000的id,然后再借助索引查询
优化
- image.png
- image.png
-
int 类型占用4个字节,而char(15)占用15个字节。
-
in中不要使用子查询。
-
不同字段OR改为Union,因为此时Union会使用不同字段的索引去查询。
-
Count(*)会进行全表扫描。
-
复杂运算移动程序端CPU。
网友评论