Both of them are direct solver to solve linear systems (opposing to iterative solver).
mldivide does perform the tests for $A$ in solving $Ax = b$. Please see Allan's answer in this thread for more information. Also see MATLAB's help on
mldivide algorithm here.
mldivide for square matrices: If A is symmetric and has real, positive diagonal elements, MATLAB attempts a Cholesky factorization. If the Cholesky factorization fails, MATLAB performs a symmetric, indefinite factorization. If A is upper Hessenberg, MATLAB uses Gaussian elimination to reduce the system to a triangular matrix. If A is square but is neither permuted triangular, symmetric and positive definite, or Hessenberg, then MATLAB performs a general triangular factorization using LU factorization with partial pivoting
linsolve for square matrices: LU factorization with partial pivoting
linsolve for rectangular matrices: QR factorization
linsolve as the help doc suggests in mathworks website, you could avoid the extra testing process (Allan used the word "overhead" in his answer) by using
opts if and only if you know what $A$ is like in advance. For large problems, you could save some time. For example:
opts.POSDEF = true; linsolve(A,b,opts)
would return $x$ if you know $A$ is positive definite in advance. However, an incorrectly chosen
opts leads to a wrong result.
If certain criteria are met,
mldivide do utilize the same factorization process. For example, for a dense positive definite system satisfying certain properties, or you have an overdetermined system and both perform least square fitting.
linsolve could also perform symbolic computation. This is handy when you have a small underdetermined system which has infinite number of solutions.
linsolve enables you to solve it symbolically,
mldivide can not do that. However, if the variables are not declared symbolically,
linsolve would give you the same warning message "Matrix is singular to working precision."
Last but not least,
linsolve does not support sparse systems like the following matrix (blue dot means non-zero entry). While
mldivide could handle sparse systems robustly when the size is under 200k by 200k.