1)查询时能不用*就不用,尽量写全字段名
2)索引优化
尽量使用"短"索引,即索引的长度/size小点,这样单位页内能存储的数据量更多。因为数据的加载都是以页为单位加载的。
经常在where子句使用的列,最好设置好索引,加快查找速度。
对于有多个列where或者order by子句的,应该建立复合索引
不要使用not in和<>操作
最左前缀匹配原则,mysql会一直向右匹配直到遇到范围查询(>,
=和in可以乱序
尽量选择区分度高的列作为索引,区分度的公式是count(distinct col)/count(*),表示字段不重复的比例
索引的列不能参与计算,保持列“干净“,b+树存的都是数据表中的字段值,但是进行检索时,需要把所有元素都应用函数才能比较,成本太大。
尽量扩展索引,不要新建索引。
3)多使用explain和profile分析查询语句,设置slow_query_log查看慢查询日志,找出执行时间长的sql语句优化
4)多表连接时,尽量小表驱动大表,即小表join大表,可以减少数据的匹配量。在hive里有map join操作,可以将小表加载到内存与大表join,加快速度。此处应该也有相关的优化原理。
5)在千万级的分页时使用limit,限制结果返回的数据量
6)对于经常使用的查询,可以开启缓存。
7)对于热点数据,可以缓存到分布式缓存里。
8)当表的数据量变得很大时,可以考虑分库分表,对数据进行垂直拆分和水平拆分等。
9)避免在where字句中对字段进行null值判断,会导致引擎放弃使用索引而进行全表扫描
10)对于联合索引,要遵守最左前缀法则
11)exists以外层表为驱动表,先被访问,如果是in,先执行子查询,所以in适合于外表大而内表小的情况,exists适合于外表小而内表大的情况。
总结:mysql的优化主要在于:索引的优化.sql语句的优化,表的优化, 在高并发网络环境下除了优化数据库外,还会涉及到分布式缓存,cdn,数据库读写分离等高并发优化技术。