MySQl优化SQL主要从两个方向进行:硬件级别和数据库级别
硬件级别包括磁盘寻找(寻址)、磁盘读写、CPU和存储带宽(CPU缓存)四方面。
寻址----其优化方式一般为换固态硬盘或换内存;
磁盘读写 ----数据库的本质是一组文件集 程序运行在内存中 因为要与硬盘进行IO操作 所以速率变慢 编程时 想尽办法减少硬盘的IO。
数据库级别最高效的因素是数据库的基本设计。
数据库级别优化包括表结构优化、索引、存储引擎、行格式、锁策略和缓存区大小设置。
表结构----表结构设计是否正确;
索引----正确的设置索引达到查询高效,索引是数据库中成本最低效果最好的一种提升查询的手段;
存储引擎----对于不同情况 选择不同存储引擎
行格式----每张表是否具有适当的行格式、每个列类型是否合适、 约束是否都加了。 比如说性别可设置为布尔类型,用0、1存储,用的空间少。
锁策略----应用程序使用适当的锁策略(也叫排队机制) 在高并发项目中用到的比较多。
未使用锁策略可能引发的问题:
脏读(事务A读取到了事务B未提交的数据,事务A读取到的数据叫做脏数据,读取数据的过程叫做脏读);
幻读(事务A把整个表数据查询出来了 ,事务B同时向表中插入一条 ,A查询出的数据可能不包含B新插入的数据,读取出来之后发现和现在 的行数不一致);
不可重复读(针对于表中一行数据或一行中某列数据 当事务A在修改一行数据时没有提交,事务B读取到了这行数据 事务B读取的数据就是 旧数据和以后的真实数据不一致,为了防止事务B读取到未操作完成的数据的过程叫做不可重复读 ,主要针对修改的情况)。这三个针对于 事务未提交,高并发情况。这时候就要用到锁策略也叫排队机制。
要想两个并发事务不出现幻读。锁上之后只能进行排队,可以锁整个表(表级锁) 也可以锁一行(行级锁)或者列级锁。
幻读可以用表级锁,不可重复读可以用行级锁。
缓存区设置----确认所有缓存区使用的大小是否都正确。缓存要保持一个度,要把数据能缓存进去。不能过大寻址慢,也不能过小存不下。