- Mysql单进程多线程设计。
-
InnoDB优点
- 5.5以后默认引擎
- 行级锁
- 支持事物
- 更好的恢复性
- 高并发下性能更好,对多核、大内存、ssd等硬件支持好。
mysql的InnoDB采用的索引算法
B+树
B+树索引
聚集索引
一个表只有一个聚集索引,根据主键生成(如果设置主键),图中红色
一个叶子节点存放整行记录二级索引(辅助索引)
非聚集索引都是二级索引,如果非主键查询,会先根据二级索引找到主键,在根据聚集索引中查找数据。图中蓝色。
一个叶子节点存放主键没有索引就会进行全表扫描。
索引是一切快速查询的前提。
索引可以提供效率,但也会降低插入和更新的速度并占有磁盘空间。
单张表索引数量不要超过5个,
单个索引中的字段数不超过5个
索引操作
- 查看表的索引
show index from 表名 mysql查看表索引
Sql优化案例
案例一
-
在sql查询中=号左边使用表达式,会放弃索引
查看语句执行计划
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多万行。
案例三
- 查询偏移量80000的id,然后再借助索引查询
优化
int 类型占用4个字节,而char(15)占用15个字节。
in中不要使用子查询。
不同字段OR改为Union,因为此时Union会使用不同字段的索引去查询。
Count(*)会进行全表扫描。
复杂运算移动程序端CPU。