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

mysql的相关信息的更多相关文章

  1. Linux Mysql 权限相关信息 来源于网络

    查看用户权限 show grants for 你的用户 比如: show grants for root@’localhost’; mysql> use mysql; Database chan ...

  2. 查看mysql相关信息

    查看本机mysql的相关信息,执行以下SQL即可: SHOW VARIABLES LIKE "%char%";

  3. MySQL查看数据库相关信息

    使用MySQL时,需要了解当前数据库的情况,例如当前的数据库大小.字符集.用户等等.下面总结了一些查看数据库相关信息的命令   1:查看显示所有数据库 mysql> show databases ...

  4. 查看mysql数据库连接数、并发数相关信息

    查看mysql数据库连接数.并发数相关信息. - caodongfang126的博客 - CSDN博客 https://blog.csdn.net/caodongfang126/article/det ...

  5. Mysql查看连接数相关信息

    MySQL查看连接数相关信息在 数据库:INFORMATION_SCHEMA 表:PROCESSLIST 表结构如下: mysql> desc PROCESSLIST; +---------+- ...

  6. (转)查看mysql数据库连接数、并发数相关信息

    查看mysql数据库连接数.并发数相关信息 1.mysql> show status like 'Threads%';+-------------------+-------+| Variabl ...

  7. [转]MySQL查看数据库相关信息

    原文链接:MySQL查看数据库相关信息 使用MySQL时,需要了解当前数据库的情况,例如当前的数据库大小.字符集.用户等等.下面总结了一些查看数据库相关信息的命令 1:查看显示所有数据库 mysql& ...

  8. mysql命令学习笔记(1):show table status like 'user';显示表的相关信息

    show table status like 'user';显示表的相关信息 +------------+--------+---------+------------+------+-------- ...

  9. Mysql优化相关总结

    Mysql优化相关总结 2016-05-31 数据库集中营 优化顺序: 选择适当的引擎和表结构和数据类型 建立索引,优化sql. 增加缓存,redis.memcache. 主从.主主,读写分离. my ...

随机推荐

  1. Java编译后产生class文件的命名规则

    今天刚好有同学问了下Java编译后产生的.class文件名的问题,虽然一直都在使用Java做开发,但是之前对编译后产生的.class文件名的规范也基本没做了解过,也真的是忏愧啊!今天无论如何都要总结下 ...

  2. 如何从CentOS官网下载我们想要的版本

    今天想从官网下载6.5版本的CentOS,结果找了好一会儿才找到,赶紧记录下来,以备以后查询. 第一步在百度搜索centos,点击"Download CentOS",如下图所示. ...

  3. c# http请求添加cookie

    CookieCollection cookList = new CookieCollection(); cookList.Add(new Cookie("cf_clearance" ...

  4. CListBox自动换行显示

    需要在ListBox控件中显示一些信息.为方便查看,不使用水平滚动条.当要输出的字符串占用的宽度超过ListBox的宽度时,截断字符串,剩余的在下一行显示. 1. 计算ListBox所占的宽度,用Ge ...

  5. identity_insert---实验性插入大批量数据和分页存储过程

    OK,我们首先创建一数据库:data_Test,并在此数据库中创建一表:tb_TestTable 1create database data_Test --创建数据库data_Test 2use da ...

  6. 使用typescript开发react应用

    初始化 mkdir project-dir cd project-dir yarn init -y 安装依赖 yarn add react react-dom yarn add -D typescri ...

  7. 论坛模块__发帖时使用FCKeditor

    论坛模块__发帖时使用FCKeditor 测试 <html> <head> <meta http-equiv="content-type" conte ...

  8. Ubuntu16.04最快捷搭建小型局域网Git服务器

    导读 使用linux操作系统,不得不提Git版本管理器,这个Linus花了两周时间开发的分布式版本管理器(这就是大神,先膜了个拜...),毫无疑问,Git版本管理器与linux系统有着与生俱来的同一血 ...

  9. Mybatis框架中Mapper文件传值参数获取。【Mybatis】

    1.参数个数为1个(string或者int) dao层方法为以下两种: /** * 单个int型 */ public List<UserComment> findByDepartmentI ...

  10. spring @Transactional注解参数详解(转载)

    事物注解方式: @Transactional 当标于类前时, 标示类中所有方法都进行事物处理 , 例子: 1 @Transactional public class TestServiceBean i ...