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------------------------------------------------------------------------------------------------------------------