1. 对查询进行优化,应尽量避免全表扫描、索引失效,首先考虑在where以及order by涉及的列上建索引,查询语句要注意索引失效的条件。(索引失效条件:条件中使用or、使用’!=’或’<>’进行判断/比较、不符合最左前缀原则、使用is not null或is null、like查询时以%开头、使用全表扫描比使用索引快时)
  2. InnoDB缓冲池配置是否合理(要求大到足以容纳经常访问的数据,但又不会大到使物理内存过载导致分页)?
  3. 合理地使用锁(尽可能允许共享访问,在适当的时候请求独占访问)。

优化SELECT语句

索引

索引用于快速查找具有特定列值的行。如果没有索引,MySQL 必须从第一行开始,然后读取整个表以查找相关行。桌子越大,成本越高。如果表有相关列的索引,MySQL 可以快速确定要在数据文件中间查找的位置,而无需查看所有数据。这比顺序读取每一行要快得多。

使用索引的好处:

  • 快速找到匹配WHERE子句的行

优化数据库结构

  • 尽量使用MEDIUMINT而不是INT(因为MEDIUMINT比INT占用的空间少了25%)
  • 尽可能的申明一列为NOT NULL
  • 按需创建索引,不要创建非必要的索引(索引有利于检索,但会减慢插入和更新操作)。
  • 列名尽量简单(xxx_name ——> name)
  • 当您使用随机生成的值作为InnoDB表中的主键时,如果可能,请在其前面加上一个升序值,例如当前日期和时间。当连续的主值物理存储在彼此附近时,InnoDB可以更快地插入和检索它们。
  • UNDO LOG的大小需要大一些(8.0以上大的UNDO LOG恢复时间优化的更快了,小的重做日志会导致许多不必要的磁盘写入)【innodb_log_file_size】重做日志大小、【innodb_log_files_in_group】重做日志数量
  • 增加日志缓冲区的大小(如果有更新、插入、删除涉及许多行的事务,就要让日志缓冲区更大,这可以节省磁盘I/O)【innodb_log_buffer_size】日志缓冲区大小
  • 高并发的系统应该启用日志写入器线程,这可以提高并发的性能。低并发的系统应该禁用这个选项【innodb_log_writer_threads】日志写入器线程
  • 增加缓冲池大小,因为表数据存在InnoDB缓冲池中时,查询语句可在缓冲池中重复、快速的访问,而不需要任何的磁盘I/O【innodb_buffer_poll_size】缓冲池大小(应该设置为所在服务器系统内存的50%~75%)