数据库如何调优和写sql的技巧

外部调优

1,使用连接池。 性能提升10倍

2, 阻止不必要的参数不让传进来

3,增加最大连接数,及时释放连接

内部调优

1,改mysql进程(对MySQL服务器(也称为mysqld)进行调优。)

 对这个进程进行调优意味着适当地分配内存,并让 mysqld 了解将会承受何种类型的负载。加快磁盘运行速度不如减少所需的磁盘访问次数。

类似地,确保 MySQL 进程正确操作就意味着它花费在服务查询上的时间要多于花费在处理后台任务(如处理临时磁盘表或打开和关闭文件)上的时间。对mysqld进行调优是本文的重点。

  最好的方法是确保查询已经进行了优化。这意味着对表应用了适当的索引,查询是按照可以充分利用MySQL功能的方式来编写的。尽管本文并没有包含查询调优方面的内容(很多著作中已经针对这个主题进行了探讨),不过它会配置mysqld来报告可能需要进行调优的查询。

  虽然已经为这些任务指派了次序,但是仍然要注意硬件和mysqld的设置以利于适当地调优查询。机器速度慢也就罢了,我曾经见过速度很快的机器在运行设计良好的查询时由于负载过重而失败,因为mysqld被大量繁忙的工作所占用而不能服务查询。

参考了:https://kb.cnblogs.com/page/96934/

2、写SQL 技巧

高效查重、不重:

oracle : 因为使用了ROWID

select a.*
from T_I9V_B_BILL_DISCOUNT a where a.ROWID = (select min(x.ROWID)
from T_I9V_B_BILL_DISCOUNT x where x.PROD_TYP_ID = a.PROD_TYP_ID and x.DUBIL_ORDR_NUM = a.DUBIL_ORDR_NUM);

mysql :  (menu_uuid  为主键)

SELECT
    * 
FROM
    pub_menu AS ta 
WHERE
    ta.menu_uuid <> ( SELECT max( tb.menu_uuid ) FROM pub_menu AS tb WHERE ta.menu_type = tb.menu_type );

3,索引优化:

1   索引占用磁盘或者内存空间 减慢了插入更新操作的速度

2  前缀索引的作用是可以减少索引的大小到原来的60%的. alter table user add index sch_pre3(school(3))

3   where 后两个条件,都加上单索引  ,查询时只用到一个

4   创建联合索引的语法:alter table user add index school_age(school,age).      
    使用联合索引的时候,有一个非常重要的因素就是所有的索引列只可以进行最左前缀匹配,例如上面的school_age联合索引,当仅使用age作为查询条件的时候是不能使用的
    此外,最左前缀索引只能使用一个范围查询 select * from user where school > a and age > 12中,仅school可以命中索引 
     
5 、一个表上只能有一个聚簇索引. 一个数据表中的数据总得有且只有一种排序方式来存储在磁盘上,因此这是必须的.  主键> 一个唯一的非空索引> 生成一个隐式的主键

6  毫无作用的  :    在主键上再建立一个普通索引
                    在有联合索引school_age的情况下,再建立一个school的独立索引    

4 模板语句

 mysql :

使用show index from table_name来查看某个表上的索引
 使用show create table table_name来查看建表语句,其中包含创建索引的语句   

oracle : 

查看建表语句:

select dbms_metadata.get_ddl('TABLE','I9_BLACKLIST','POC_I9_BASE') from dual;       

查数据和索引大小

mysql:
 // 查看当前MySQL服务器所有索引的大小(以MB为单位,默认是字节)
   SELECT CONCAT(ROUND(SUM(index_length)/(1024*1024), 2), ' MB') AS 'Total Index Size' FROM TABLES
  // 查看某一个库的所有大小
   SELECT CONCAT(ROUND(SUM(index_length)/(1024*1024), 2), ' MB') AS 'Total Index Size' FROM TABLES  WHERE table_schema = 'XXX';
  // 查看某一个表的索引大小
   SELECT CONCAT(ROUND(SUM(index_length)/(1024*1024), 2), ' MB') AS 'Total Index Size' FROM TABLES  WHERE table_schema = 'yyyy' and table_name = "xxxxx";  
  // 汇总查看一个库中的数据大小及索引大小
   SELECT CONCAT(table_schema,'.',table_name) AS 'Table Name', CONCAT(ROUND(table_rows/1000000,4),'M') AS 'Number of Rows', CONCAT(ROUND(data_length/(1024*1024*1024),4),'G') AS 'Data Size', CONCAT(ROUND(index_length/(1024*1024*1024),4),'G') AS 'Index Size', CONCAT(ROUND((data_length+index_length)/(1024*1024*1024),4),'G') AS'Total'FROM information_schema.TABLES WHERE table_schema LIKE 'xxxxx';
 

参考 : https://blog.csdn.net/weixin_44104367/article/details/101594591

             https://blog.csdn.net/wanghao112956/article/details/91040590

发布了51 篇原创文章 · 获赞 35 · 访问量 6634

猜你喜欢

转载自blog.csdn.net/wang_lianjie/article/details/103732056