Mysql学习笔记
来源:作者:JAVA分享网
1.对于varchar类型的列,存储同样的字符串的空间开销是一样的,为什么使用更短的列有优势?
更长的列会消耗更多的内存,因为Mysql通常会分配固定大小的内存块来保存内部值,尤其是使用内存临时表进行排序或操作时,还有在利用磁盘临时表进行排序时同样糟糕
2.重新设置数字类型的主键自增值
alter table users AUTO_INCREMENT=1;
3.sql_mode的相关设置
ONLY_FULL_GROUP_BY:
对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中
NO_AUTO_VALUE_ON_ZERO
该值影响自增长列的插入。默认设置下,插入0或NULL代表生成下一个自增长值。如果用户 希望插入的值为0,而该列又是自增长的,那么这个选项就有用了
STRICT_TRANS_TABLES
在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做限制
NO_ZERO_IN_DATE
在严格模式下,不允许日期和月份为零
NO_ZERO_DATE
设置该值,mysql数据库不允许插入零日期,插入零日期会抛出错误而不是警告。
ERROR_FOR_DIVISION_BY_ZERO
在INSERT或UPDATE过程中,如果数据被零除,则产生错误而非警告。如 果未给出该模式,那么数据被零除时MySQL返回NULL
NO_AUTO_CREATE_USER
禁止GRANT创建密码为空的用户
PIPES_AS_CONCAT
将”||”视为字符串的连接操作符而非或运算符,这和Oracle数据库是一样的,也和字符串的拼接函数Concat相类似
ANSI_QUOTES
启用ANSI_QUOTES后,不能用双引号来引用字符串,因为它被解释为识别符
SQL_MODEL具体详见Mysql官方文档http://dev.mysql.com/doc/refman/5.5/en/sql-mode.html
Mysql分页方式
普通limit M,N的翻页写法,往往在越往后翻页的过程中速度越慢,原因 mysql会读取表中的前M+N条数据,M越大,性能就越差:
select * from t where sellerid=100 limit 100000,20 优化写法: select t1.* from t t1, (select id from t sellerid=100 limit 100000,20) t2 where t1.id=t2.id; 优化后的翻页写法,先查询翻页中需要的N条数据的主键id,在根据主键id回表查询所需要的N条数据,此过程中查询N条数据的主键ID在索引中完成
这种优化的根本出发点,是减少在数据页中的扫描量。
覆盖索引,也是一种优化思路,出发点就是直接从二级索引中直接获取查询结果。
Mysql字符集
只有基于字符的值才真正的有字符集的概念,对于其他类型,字符集只是一个设置,指定用哪一种字符集来做比较或者其他的操作。基于字符的值能存放在某列中、查询的字符串。表达式的计算结果中或者某个用户变量中等。
mysql字符集的继承关系:数据库字符集–>表字符集–>列字符集,最终的影响是列的字符集,那是真正存放数据的地方,所以更高层次的设置只是指定默认值。一个表的默认的字符集设置无法影响存储在这个表中某个列的值,只有当创建列而没有对该列指定字符集的时候,才会使用上层设置的字符集。
上一篇:网站建设Java常见面试题和答案
下一篇:JAVA程序员常见问题解析