sql调优总结,还在更新中......

sql优化的基本方法:

         

   

       1.表的设计满足3NF:

              目前设计的最高级别是6NF,含义百度。

              1NF:表的属性(列)具有原子性,表的列不能再分割(列本身的含义如地址不能分为地和址)。

                         不能有重复列。

                         说明:只要是关系型数据库天然满足1NF

                         常见的数据库:关系型(mysql,oracle,sql server,informix(银行),db2(海量表),postgres)

                                                  非关系型(nosql,Redis,MongoDB)

       

1-------------------------------------------------------------------------------------------------------------------

             2NF:表中不能有完全重复的一条记录,一般情况下通过设置主键来限定,是自增的。

             3NF:如果列的内容可以推导出来就不能(显示推导和隐式推导就不要单独测存放)单独用一列存放。

              

             

            反3NF:在通常的情况下表的设计要遵守3NF的原则,但是也有例外,反而会提高查询效率。

            案例:

           

            规则:1.一个相册有多个图片。

                       2.当用户点击图片,其浏览次数增加一次。

                       3.相册的浏览次数==其所有图片浏览次数的总和

                      分表:

                      

                       这样的设计是不合理的。

                       

                       打开相册时候查看总的浏览次数,这样是合理的。

                      评判:代码测试下就可以了。

2---------------------------------------------------------------------------------------------------------------

                     构建海量表(8000000)每条数据不一样的。这时我们要使用存储过程。
                     对表进行查询:

                    创建部门表:

                           

                    创建EMP雇员表

                     

                     创建工资级别表

                    

                   数据:

                   

                    这个是代替分号的。

                    创建函数:

                    

                   测试这个函数。

                   返回随机的部门号:

                  

                  

                  报错的原因:1418,

                  

3---------------------------------------------------------------------------------------------------------------

                 海量表带来的问题:

                         看一个案例:

                        

                        要一秒钟。

                        1.使用索引优化

                                 给empno字段添加主键索引。

                           

    alter table emp add primary key (rmpno);

                               

                              打开my.ini数据库的数据默认是存放在这个路径的。

                             

                           上面的三个文件分别的结构数据索引(存储引擎是MyISAM)。

                            一般来讲索引占表的1/3

                                   索引文件72M文件300M

                          再次查询:

                          几乎没有时间。

                          问题解决了。但是缺点是占内存只在加索引的字段上有效。

                          定位慢查询(slow query):默认情况下,mysql是不会定位慢查询的,我们在测试的时候可以指定mysql记录慢查询。

                            启动的时候。

                                  mysql>bin/mysqld.exe --safe-mode --slow-query-log

                             过程:

                             关闭mysql-在启动里面关闭。

                             启动:cd到mysql的目录   bin/mysqld.exe --safe-mode --slow-query-log

                          

                            

                            日志记录慢查询。-----定义10秒是慢查询。

                            了解,如何查询mysql的参数。

                             mysql的变量和查询。

                             mysql>show variables

                             mysql>show variables like 'long_query_time'

                            

                             mysql>set long_query_time=1

                            

                            再查询一次(慢查询):

                            

                            

                             发生时间,登陆的身份,ip地址,查询时间,锁的时间(时间长了就是等的时间查询的人多要解决数据量的吞吐量的问题),查询时间长是数据量大。

4----------------------------------------------------------------------------------------------------------------

                           如何分析一个sql的问题,explain。

                          基本用法:explain sql\G    

                          案例:

                         

                         id

                        查询类型

                        表

                        扫描方式

                        对当前sql有什么索引

                        语句实际用的什么索引

                        

                        分组尽量少用,分组的效率是非常低的。

                       

                      

                      优化:添加索引---分表

5-----------------------------------------------------------------------------------------------------------------

     

       1.索引的添加:

       2. 索引的查询:

       3. 索引的修改:

       4. 索引的删除:

       5.索引的原理:   

       6. 索引的注意事项:

     1.主键索引的创建: 

                1).在创建表的时候指定某列或者某几列为主键索引

             

          例子:

          主键索引.

          索引的查询:

                  desc

                           Non_unique:是唯一的索引.

        2).添加表后再指定主键索引

                       

                  -------------1:

                       ALTER TABLE 表名 ADD PRIMARYKEY(列名 1,列名 2......)                     

                 --------------2:

                   主键索引的特点:

                                  一个表最多只能有一个主键

                                   一个主键可以指向多列(复合主键)

                                   主键索引的效率是最高的,因此我们应该给id,一般id是自增的

                                   主键索引的列是不能重复的,也不能为null

6------------------------------------------------------------------------------------------------------------------

                       

7------------------------------------------------------------------------------------------------------------------

猜你喜欢

转载自blog.csdn.net/qq_28764557/article/details/88943353