1
当一张表的数据量达到千万级别的时候,任何对表的操作都得小心翼翼。核心点在于避免全表扫描、避免锁表、避免产生大量行锁。
本质上是让每一次sql的执行都更快的完成,避免过长时间占用数据库连接,让连接能够迅速的释放回数据库连接池,提供更多稳定的服务。
一旦产生大量的行锁甚至表锁,将会带来连接瞬间被打满、数据库资源耗尽、服务宕机的灾难性后果。所以如何避免以上问题的发生才是最重要的,绝不能等问题发生之后再去解决。
SQL查询的执行路径:
sql优化
所有sql必须命中索引,禁止全表扫描
2
千万级大表在不考虑分库分表的情况下有如下几个可以优化的地方,仅供参考:
数据库层面
主键最好是递增的,不要用uuid,降低空间占用;
根据需要查询的字段,建立合适的索引(包括联合索引),必要的时候根据explain查看执行计划分析索引是否被命中
根据查询条件,删掉一些命中率比较低的索引,提高数据插入效率;
对于一些复杂查询,比如order by、group by等,要注意执行计划的Extra列是否有Using temporary字样,如果有的话就意味着使用了临时表,这种查询的频率比较高的话,可以适当增大内存临时表空间,可以提高查询速度;