mysql的相关信息
mysql数据库优化技巧
表的设计合理(字段合理,符合3NF) 添加适当索引(index)[主要4种:普通索引,主键索引,唯一索引unique,全文索引] 分表技术(水平分表->拆分表结构,垂直分表->根据适当的方式,将数据存储到不同的库表当中) 读写分离 存储过程(模块化编程,少去编译环节提高速度) 对mysql优化配置(最大连接数my.ini 或 my.cnf的参数max_connections,调整缓存大小) mysql服务器硬件 定期维护清除不需要的数据,定时进行碎片整理(MyISAM)
1、表的设计合理(字段合理,符合3NF)
1NF:对属性的原则性约束,要求列具有原子性,不可再分解(只要是关系型数据库就自动满足1NF) 2NF:对记录的唯一性约束,要求记录有唯一标识,即实体的唯一性(一般通过添加主键实现) 3NF:对字段的冗余性约束,要求字段没有冗余(一般通过表的外键实现) 但是没有冗余的数据库未必就是好的设计方案,例如 商城用户下单的地址信息
2、SQL语句优化(慢查询)
show status; //提供服务器的状态信息 show [session|global] status like 'com_select'; //select次数 默认为session 当前链接的统计结果,global表示数据库上次至今的统计结果 show STATUS like 'connections';//当前连接数 show STATUS like 'uptime';//服务器运行时间 show STATUS like 'slow_queries';//慢查询的次数 默认情况mysql中10秒以上为慢查询 show VARIABLES like 'long_query_time';//当前默认慢查询时间 set long_query_time=1;//设置慢查询时间 默认情况下:mysql不会记录慢查询,只有启动mysql时候,指定记录慢查询才可以 mysqld.exe --safe-mode --slow-query-log [版本5.5 可以在my.ini中指定]
全文索引:
1.在mysql中fulltext 索引只针对 myisam生效 2.mysql自己提供的fulltext针对英文生效->sphinx (coreseek) 技术处理中文 3.使用方法是 match(字段名..) against(‘关键字’) 4.全文索引:停止词, 因为在一个文本中,创建索引是一个无穷大的数,因此,对一些常用词和字符,就不会创建,这些词,称为停止词.比如(a,b,mysql,the) select match(title,body) against ('database') from articles;(输出的是每行和database的匹配度)
唯一索引:
unique字段可以为NULL,并可以有多NULL, 但是如果是具体内容,则不能重复,但是不能存有重复的空字符串’’
一般字段建立索引规则如下:
a.一般经常性放到where条件之后的 b.该字段内容不是唯一的固定几个值(例如:性别) c.字段内容不是经常变化
索引的使用
查询需要使用索引最重要的是查询条件中需要使用索引
下面几种情况可能使用索引:
对于创建的多列索引,查询条件如果使用了最左边的列,索引一般会被使用(比如创建了 create index PersonIndex on Person(name,sex,age)相当于建立了(name)(name,sex)(name,sex,age) name是最左边的列,必须出现在where条件中,否则使用不了索引)
对于使用like查询,查询如果是“%aaa”不会使用索引,对于“aaa%”会使用到索引,如果一定需要前面有变化的值,则考虑使用全文索引(fulltext)或者sphinx(英文索引引擎),如果是中文,则考虑使用coreseek(sphinx中文版本 相当于sphinx+mmseg中文分词)
下列几种情况不会使用索引: 如果条件中有or ,即使有条件中带索引也不会使用,换言之,使用or条件就是要求使用的所有字段都必须建立索引,才能使用起来索引 对于多列索引,如果没有使用最左边的字段,也不会使用索引 like查询以%开头 如果字段类型是字符串,那一定要在条件中将数据使用引号引起来,否则不使用索引 如果mysql估计全表扫描比索引要快,则不使用索引
Sql语句优化:
在使用group by 分组查询是,默认分组后,还会排序,可能会降低速度,在group by 后面增加 order by null 就可以防止排序
mysql的索引和最左前缀原则:
通过实例理解单列索引、多列索引以及最左前缀原则 实例:现在我们想查出满足以下条件的用户id: mysql>SELECT `uid` FROM people WHERE lname`='Liu' AND `fname`='Zhiqun' AND `age`=26 因为我们不想扫描整表,故考虑用索引。 单列索引: ALTER TABLE people ADD INDEX lname (lname); 将lname列建索引,这样就把范围限制在lname='Liu'的结果集1上,之后扫描结果集1,产生满足fname='Zhiqun'的结果集2,再扫描结果集2,找到 age=26的结果集3,即最终结果。 由 于建立了lname列的索引,与执行表的完全扫描相比,效率提高了很多,但我们要求扫描的记录数量仍旧远远超过了实际所需 要的。虽然我们可以删除lname列上的索引,再创建fname或者age 列的索引,但是,不论在哪个列上创建索引搜索效率仍旧相似。 2.多列索引: ALTER TABLE people ADD INDEX lname_fname_age (lame,fname,age); 为了提高搜索效率,我们需要考虑运用多列索引,由于索引文件以B-Tree格式保存,所以我们不用扫描任何记录,即可得到最终结果。 注:在mysql中执行查询时,只能使用一个索引,如果我们在lname,fname,age上分别建索引,执行查询时,只能使用一个索引,mysql会选择一个最严格(获得结果集记录数最少)的索引。 3.最左前缀:顾名思义,就是最左优先,上例中我们创建了lname_fname_age多列索引,相当于创建了(lname)单列索引,(lname,fname)组合索引以及(lname,fname,age)组合索引。 注:在创建多列索引时,要根据业务需求,where子句中使用最频繁的一列放在最左边。
mysql授权:
grant all privileges on *.* to zzp@'%' identified by '456852';